栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

串的模式匹配算法---KMP算法和朴素模式匹配算法(C语言版)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

串的模式匹配算法---KMP算法和朴素模式匹配算法(C语言版)

1.朴素模式匹配算法:
(1)王道代码

int Index (SString S,SString T){
       int k=1;//设置k,为主串后退标记
       int i=k, j=1;
       while(i<=S.length&&i<=T.length){
              if( S.ch[i]=T.ch[j] ) {
                   i++;
                   j++;//继续比较后续的字符
              }
              else{
                  k++;//检查下一个子串
                  i=k;
                  j=1;
              }
      if( j>T.length)     return k;

      else  return 0;
}

(2)课本代码

int Index (SString S,SString T){
       int i=i, j=1;
       while(i<=S.length&&i<=T.length){
              if( S.ch[i]=T.ch[j] ) {
                   i++;
                   j++;
              }
              else{
                  i=i-j+2; //指针后退重新开始匹配
                  j=1;
              }
      if( j>T.length)     return i-T.length;

      else  return 0;
}

这两个代码的时间复杂度都为O(nm);

2.KMP算法
(1)主体算法:

int Index_KMP(SString S, SString T, int next[] ) {
          int i=1, j=1;
          while(i<=S.length && i<=T.length) {
                  if( S.ch[i] == T.ch[j] ) {
                         i++;
                         j++;//继续比较后续字符
                   }
                   else{
                         j=next[j]; //模式串向右移动
                   }
          }
          if(j > T.length)
                  return i-T.length;  //匹配成功
          else
                  return 0;
}

(2)关于next[ ] 数组的形成:
串的前缀:包含第一个字符,但不包含最后一个字符的子串
串的后缀:包含最后一个字符,但不包含第一个字符的子串
当第 j 个字符匹配失败,由前1~j-1 个字符组成的串记为 S,则:
next[ j ] = S的最长相等的前后缀长度加1;
特别地:next[ 1 ]=0; next [2] = 1;


初级代码:

void get_next( SString T , int next [  ]) {
          int i=1, j=0; // i控制后缀长度,j控制前缀长度
          next[1]=0;
          while(i 

改进代码:

void get_next( SString T , int next [  ]) {
          int i=1, j=0; // i控制后缀长度,j控制前缀长度
          next[1]=0;
          while(i 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297482.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号