KMP: 注意 next[0] = -1 是给外部排序第一个不想等的时候用的。
KMP PATTERTRN = 0, CUR =0 ;
PATTERN 和 模板大小一样的话(从0开始索引),就证明找到了一个,然后放入next从下一个开始匹配下一个。
Next 中 pre 从 -1 开始,cur要从0开始(从0开始索引)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算模板串S在文本串T中出现了多少次 * @param S string字符串 模板串 * @param T string字符串 文本串 * @return int整型 */ int kmp(string S, string T) { // write code here if(S.empty()||S.size()>T.size()){//边界处理 return 0; } // next 数组初始化 int res = 0, next[S.size()+1]; next[0] = -1; // 从模式串的第一位开始匹配,文本串指向下一位。 //标记为刚开始设置为-1,要处理从第一个元素开始匹配的情况 for(int pre = -1, cur = 0; cur<S.size();){ if(pre==-1||S[pre]==S[cur]){ pre++; cur++; next[cur] = pre; } else pre = next[pre]; } //KMP运算开始 for(int pattern = 0, cur = 0; cur< T.size();){ if(pattern==-1||S[pattern]==T[cur]){ pattern++; cur++; if(pattern==S.size()){ res++; pattern = next[pattern]; } }else{ pattern = next[pattern]; } } return res; } };