28. Implement strStr()

来源:互联网 发布:怎么分析业绩数据? 编辑:程序博客网 时间:2024/06/15 02:22

Implement strStr().

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

实现strStr()函数。
返回needle在haystack中第一次出现的位置,若needle不在其中则返回-1.

方法一:

int ImplementStrStr::strStr1(string haystack, string needle){    int m = haystack.size();    int n = needle.size();    if (n == 0) return 0;    for (int i = 0; i < m - n + 1; i++)    {        //逐个匹配,一旦不匹配,跳出循环,从下一个字符开始匹配        int j = 0;        for (; j < n; j++)        {            if (haystack[i + j] != needle[j])                break;        }        if (j == n) return i;    }    return -1;}

方法二:

KMP算法,具体内容可以从这里了解:

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
int ImplementStrStr::strStr2(string haystack, string needle){    int m = haystack.size();    int n = needle.size();    if (n == 0) return 0;    //kmp部分匹配表    vector<int> lps = kmpProcess(needle);    for (int i = 0, j = 0; i < m;)    {        if (haystack[i] == needle[j])        {            i++;            j++;        }        if (j == n) return i - j;        if (i < m && haystack[i] != needle[j])        {            //这步很关键            if (j > 0) j = lps[j - 1];            else i++;        }    }    return -1;}//计算kmp部分匹配表//这部分用测试代码调试有利于理解vector<int> ImplementStrStr::kmpProcess(string& needle){    int n = needle.size();    vector<int> lps(n, 0);    for (int i = 1, len = 0; i < n;)    {        if (needle[i] == needle[len])            lps[i++] = ++len;        else if (len > 0)            len = lps[len - 1];        else            lps[i++] = 0;    }    return lps;}
原创粉丝点击