当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > 子串匹配:不回溯算法

C/C++
VC++ SMTP协议电子邮件传送剖析
Managed C++设计新邮件检查器
解决两个难懂的安全性问题
高级扫描技术及原理介绍
VC的另类数据库编程
Visual C++6.0 API函数操作技巧集
托盘编程全接触
在Visual C++中使用内联汇编
理解 Visual C++ Extensions for ADO
TCP/IP Winsock编程要点
VC打造自己特色的屏幕保护
Windows Sockets API实现网络异步通讯
程序界面多模式显示的实现
VC++6.0中控制运行唯一实例
WDM驱动程序设计之编译安装篇
VC编程中如何操作数据库中的图像字段
Windows 9X硬件中断设备驱动程序的开发
用控件聚合技术为FlexGrid增添PickList功能
用ATL和MFC来创建ActiveX控件
用VC进行COM编程所必须掌握的理论知识

C/C++ 中的 子串匹配:不回溯算法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 239 ::
收藏到网摘: n/a

子串匹配当然也可以使用不回溯的方式实现,这个算法是笔者在作一个模糊查询的实现的时候想到的,没有确认和通常算法的异同,可能是一个很平常的思想:)。实现的思想很简单:每次比较子串长度的大字符串,若相等则返回,否则在大字符串中的起始位置递进,直到大字符串结束。

实现源码为:

int FindSubString(const char* src,const char* sub)

{

       int srcl = strlen(src);

       int subl = strlen(sub);

 

       if (subl > srcl)

              return -1;

 

       bool HasFound = false;

 

       int l = 0;

       int r = subl - 1;

 

       while ((r < srcl) && !HasFound)

       {

              int i;

              for (i = 0; i <= subl - 1; ++i)

              {

                     if (src[i + l] != sub[i])

                     {

                            l++;

                            r++;

                            break;

                     }

              }

 

              if (i > subl - 1)   //找到了

                     HasFound = true;

       }

 

       if (HasFound)

       {

              return l;

       }

      

       return -1;

}
 

       上面实现有一个不好处理的地方就是,当当前大字符串中子串不匹配时候,跳出后不好处理返回标志问题(代码中红色部分),因此可以将对两个相同长度字符串判断相等放到一个函数中实现,则这个实现就更加易于理解:

bool CompareEqual(const char* src,const char* sub,int l)

{

       for (int i = 0; i <= l; ++i)

       {

              if (src[i] != sub[i])

              {

                     return false;

              }

       }

 

       return true;

}
 
int FindSubString(const char* src,const char* sub)

{

       int srcl = strlen(src);

       int subl = strlen(sub);

 

       if (subl > srcl)

              return -1;

 

       bool HasFound = true;

 

       int l = 0;

       int r = subl - 1;

 

       while (r < srcl)

       {

              if (CompareEqual(src + l,sub,subl - 1))

              {

                     return l;

              }

              else

              {

                     l++;

            r++;

              }

       }

      

       return -1;

}