52 - 算法 - LeetCode 28 - 实现 strStr() -kmp


//又写了一下 kmp 参考以前的把它搞出来了 一个模式串next数组 一个遍历串 模式跳转 next[0]已经知道 从1开始 不等于 》0 &&  == 加加 
class Solution {
public:
    void make_next(string parttern,int *next)
    {
            int q =0;
            next[0] = 0;
            for(int i=1 ; i<parttern.length();i++)//得到next
            {
                while(q>0 && (parttern[q] != parttern[i]))  //不相等或者到next[0]了 
                {
                    q = next[q-1];
                }
                if(parttern[q] == parttern[i]) //如果相等
                {
                    q++;
                }
                next[i] = q;
            }
    }

    int strStr(string haystack, string needle) {
        int len = needle.length();
        if(len == 0 ) return 0;
        int next1[len+1];
        make_next(needle,next1);

        int k = 0;
        for(int i=0;i<haystack.length();i++)  //开始遍历要查找的串
        {
            while((needle[k] != haystack[i]) && (k>0) )
            {
                k = next1[k-1];
            }
            if(needle[k] == haystack[i])
            {
                k++;
            }
            if( k == needle.length())
            {
                return i - k+1;
            }
        }
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值