kmp算法
来源:互联网 发布:温州两家人 知乎 编辑:程序博客网 时间:2024/06/03 12:05
#include<iostream>#include<stdio.h>#include<string.h>#define maxSize 100using namespace std;char *str = new char[10000];char *s = new char[maxSize];int *next = new int[maxSize];void getNext(){ int len = strlen(s); next[0] = -1; // i 定位于0,由于无法向前匹配也无法向前求取next[next[i]],所以属于结束条件 int i=0,k = -1; while(i < len) { // 注意放置顺序,由于短路效应,应该先判断k的值如果为-1直接跳出 while( k!=-1 && s[i] != s[k]) { // 求(MAX)子串,可能子串里面包含更小子串 // 向前缩短直到缩短到0,终止条件为与第一个不相等,向前调到-1 k = next[k]; } // 满足结束条件直接赋值 0 // 由next[i-1] = k-1成立,符合条件s[i]==s[k],则可以得到next[i] = k; // k = -1与s[i]==s[k]为对立事件 if(k==-1||s[i]==s[k]) { ++i,++k; next[i] = k; } } return ;}int main(){ while(scanf("%s",str)!=-1) { //printf("%s\n",s); scanf("%s",s); getNext(); printf("\n"); int sLen = strlen(s); int strLen = strlen(str); // 下标定位两串开头 int i = 0,k=0; while(i < strLen) { while(k!=-1&&str[i]!=s[k]) { k = next[k]; } // 注意i右移时k的复位 if(k==-1 || str[i]==s[k]) // 这个条件可以省略 ++i,++k; if(k==sLen) break; } if(k==sLen) printf("成功!\n"); } return 0;}
阅读全文
0 0