KMP字符串匹配算法

KMP算法

KMP算法就是在一个大长的字符串里找小的字符串的算法。

// 字符串匹配之暴力法
int S[N],p[M];
for(int i = 1;i<=n;i++){ // 遍历从i开始的字符有没有可能匹配上
  bool flag = true;
  for(int j = i;j<=m;j++){
    if(S[i] != p[j]){
      flag = false;      // 已经出现没有匹配上的了
      break;
    }
  }  
}

KMP算法就是将j指针每次移动一个改变成每次移动最长公共子串个长度,这样就能极大的减少比较次数

#include <iostream>
using namespace std;
const int N = 10e5+10,M = 10e6+10;
char s[N],p[M];
int n,m;
int main(){
  cin >> n >> s+1 >> m >> p+1; // 输入的匹配串和模式串都是从下标为1开始输入,下标为0的单元等同于浪费了,不过无所谓
  
  // 求ne[]数组
  for(int i=2,j=0;i<=m;i++){
    while(j && s[i]!=p[j+1]) j = ne[j];
    if(j && s[i]!=p[j+1]) j++;
    ne[j] = j;
  }
  
  
  // KMP匹配
    for(int i = 1,j = 0;i<=n;i++){ // 遍历匹配串的每一个字母,j是输入串的指针
    // 匹配失败的情况
    while(j && s[i]!=p[j+1]) j = ne[j]; // j往回回溯
    // 匹配成功 
    if(j && s[i]!=p[j+1]) j++;
    
    if(j == m){  // 满足匹配条件后,打印开头下标
      printf("%d",i-m);
      j = ne[j];
    }
  }
  return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容