重点:理解next数组的含义,减少循环的时间。
#include <bits/stdc++.h> using namespace std; const int N=10005; int next[1005]; //优化过后的next 数组求法 void GetNextval(string p) { int pLen = p.length(); next[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { if (k == -1 || p[j] == p[k]) { ++j; ++k; if (p[j] != p[k]) next[j] = k; //之前只有这一行 else next[j] = next[k]; } else { k = next[k]; } } } int kmp(string s,string p) { int i = 0; int j = 0; int sLen = s.length(); int pLen = p.length(); while (i < sLen && j < pLen) { if (j == -1 || s[i] == p[j]) { i++; j++; } else { j = next[j]; } } if (j == pLen) return i - j; else return -1; } int main() { string s1,s2; cin>>s1>>s2; GetNextval(s2); cout<<kmp(s1,s2)<<endl; }