KMP算法

对于常规的KMP字符串匹配算法加以改进即可。
代码如下:

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()||T.size()>T.size()) return 0;//对于边界条件的判断
        int res=0;//用于结果的返回
        int i=1,j=0;
        int next[S.size()];//首先求next数组,用于保存当字符串失配时模板串应该回退的指针值
        next[1]=0;//规定next[0]=1,
        while(i<S.length()){//求解,即字符串的最大相等前后缀长度
            if(j==0||S[i]==S[j]){
                ++i;++j;//若Pi=Pj则next[j+1]=next[j]+1
                next[i]=j;
            }
            else
                j=next[j];//否则,令j=next[j],循环继续
        }
        int k=1,l=1;
        while(k<=T.length()&&l<=S.length()){//KMP算法主体
             if(l==0||T[k]==S[l]){
                 ++k;++l;//继续比较后继字符串
             }
            else
                l=next[l];//失配时,模式串向右移
            if(l==S.length()){//改进之处在于,此时加个计数值
                res+=1; 
            }
        }
        return res;
    }
};