数据结构实验之串一:KMP简单应用
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定两个字符串string1和string2,判断string2是否为string1的子串。
输入
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
输出
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
示例输入
abc a 123456 45 abc ddd
示例输出
1 4 -1
感觉KMP不好理解,要抽时间总结一下
#include <iostream> #include <algorithm> #include<cstring> using namespace std; void Next(); void kmp(); int n,m,next[1000000]; char s[1000000],t[1000000]; int main() { while(cin>>s>>t) { n=strlen(s); m=strlen(t); kmp(); } } void Next() { int i = 0, j = -1; next[0] = -1; while(i < m) { if(j == -1 || t[i] == t[j]) { i++; j++; next[i] = j; } else j = next[j]; } } void kmp() { Next(); int i = 0, j = 0; int l1 = n, l2 = m; //cout<<l1<<l2<<endl; while(i < l1 && j < l2) { if(s[i] == t[j] || j == -1) { i++; j++; } else j = next[j]; } if(j>=l2)//зЂвт >= { cout<<i-m+1<<endl; } else cout<<"-1"<<endl; }