<pre name="code" class="cpp">#include<iostream> #include<vector> #include<string.h> using namespace std; void get_next(vector<int>& next,const char* subStr) { int length=next.size(); next[0]=-1; //next[0] = -1 int i=0,j=-1; while(i<length-1) //i<length-1,为循环限制条件 { if(j==-1 || subStr[i]==subStr[j]) { next[++i] = ++j; } else j = next[j]; //数组适当进行回退 } } int kmpMatch(const char* str,const char* substr) { int lengthS=strlen(str); int length=strlen(substr); vector<int> next(length,0); get_next(next,substr); int i=0; int j=0; while(i<lengthS && j<length) { if(j==-1 || str[i]==substr[j])//j==-1也是就回退到了子串的开头位置,则i,j都向前一步 { //假设主串和子串匹配,也须要向前一步 i++; j++; } else { j=next[j];//假设未能匹配则回退到下一位置 } } if(j==length)//已经查找到子串的末尾 return i-length; else return 0; } int main() { const char* str="abcababcabcabx"; const char* subStr="abcabx"; cout<<kmpMatch(str,subStr)<<endl; return 0; }