leetcode Implement strStr()

Implement strStr().

Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.

朴素匹配好像超时,只能改用kmp了。关于kmp算法就不多说了,是很经典的问题了,我只想补充一下,kmp有两种写法,有一个优化版本的。这两个版本不同之处在于求next数组的不同方法,我使用的是一般的next数组,next数组
就是保存最长前缀和后缀的匹配重度。

如果不理解kmp,搜下到处都有了,好久不看,自己推next推了很久才想起来。

class Solution {
public:

       void get_n(const char * pattern,int *p,int n)
        {
            p[0]=-1;
            for(int i=1;i<n;i++)
            {
                int j=p[i-1];
                while(j>=0&&pattern[j+1]!=pattern[i])
                    j=p[j];
                if(pattern[j+1]==pattern[i])
                    p[i]=j+1;
                else
                    p[i]=-1;
            }
        }
    char *strStr(char *haystack, char *needle) {
       if(!haystack||!needle)
        return NULL;
        int m=0,n=0;
        while(haystack[m])m++; 
        while(needle[n])n++;
        if(m<n)
            return NULL;
        int next[n];
        get_n(needle,next,n);
        int i=0,j=0;
        while(i<m&&j<n)
        {
            if(haystack[i]==needle[j])
            {
                i++;j++;
            }
            else
                if(j==0)
                    i++;
                else
                {
                    j=next[j-1]+1;
                }
        }
        if(j==n)
            return haystack+i-j;
        return NULL;
    }
};
如有不正之处请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值