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 &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] 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

你可能感兴趣的:(LeetCode,OJ,LeetCode解题报告)