<LeetCode OJ> 28. Implement strStr()

28. Implement strStr()

Total Accepted: 85665  Total Submissions: 360485  Difficulty: Easy

Implement strStr().

题目意思:找到needle字符串在haystack字符串中第一次出现的下标,返回即可。

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.


KMP算法

就是KMP算法,没撒子好分析的!
复习算法导论:http://blog.csdn.net/ebowtang/article/details/49129363

class Solution {
public:
    //计算模式needle的部分匹配值,保存在next数组中      
    void MakeNext(const string &P, vector<int> &next) {  
        int q, k;//k记录所有前缀的对称值      
        int m = P.size(); 
        next[0] = 0;//首字符的对称值肯定为0      
        for (q = 1, k = 0; q < m; ++q)//计算每一个位置的对称值      
        {  
            //k总是用来记录上一个前缀的最大对称值      
            while (k > 0 && P[q] != P[k])  
                k = next[k - 1];//k将循环递减,值得注意的是next[k]<k总是成立      
            if (P[q] == P[k])  
                k++;//增加k的唯一方法      
            next[q] = k;      
        }  
    } 
    int strStr(string haystack, string needle) {
        if(needle.empty())
            return 0;
        if(haystack.empty())
            return -1;
        int n = haystack.size();  
        int m = needle.size();  
        vector<int> next(m,0);
        MakeNext(needle, next);  
        for (int i = 0, q = 0; i < n; ++i)  //q记录当前相同字符数
        {  
            while (q > 0 && needle[q] != haystack[i])  //跳过一些不必要的...速度就在这里被提升,
                q = next[q - 1];  
            if (needle[q] == haystack[i])  //相等就增加q的个数
                q++;  
            if (q == m)  //等于needle的size时即可返回结果
                return (i - m + 1); 
        }  
        return -1;
    }
};





别人家的算法:

BF算法:暴力的模式匹配,DONE

class Solution {
public:
    //简单模式匹配算法(BF算法)
    int strStr(string haystack, string needle) {
        int hlen = strlen(haystack.c_str());
        int nlen = strlen(needle.c_str());

        int i = 0, j = 0;
        while (i < hlen && j < nlen)
        {
            if (haystack[i] == needle[j])//相等
            {
                i++;
                j++;//增加相同字符个数
            }
            else{//两个字符串不相等,KMP在这里进行了优化
                i = i - j + 1;
                j = 0;//相同字符的个数置零
            }
        }

        if (j == nlen)
            return i - j;
        else
            return -1;
    }
};






注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50480410

原作者博客:http://blog.csdn.net/ebowtang

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值