28.实现strStr()

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
 
解法1:暴力法,双重循环
int strStr(std::string haystack, std::string needle) {
        if(needle.empty())
            return 0;

        int hSize = haystack.size();
        for(int i=0; i<hSize; ++i)
        {
            if(hSize - i < needle.size())
                break;

            int index = i;
            int nIndex = 0;
            while(index < hSize && nIndex < needle.size() && haystack[index] == needle[nIndex])
            {
                ++nIndex;
                ++index;
            }

            if(index - i == needle.size())
            {
                return i;
            }
        }

        return -1;
    }

解法2:一次循环

int strStr(std::string haystack, std::string needle) {
        if(needle.size() == 0 || (haystack.size() == 0 && needle.size() == 0))
            return 0;
        if(haystack.size() == 0 || needle.size() > haystack.size())
            return -1;
        int i = -1, j = 0;
        while(++i < haystack.size()) {
            if(haystack[i] == needle[j]) {
                // 按位比较,直到最后一位
                if(j++ == needle.size() - 1)
                    return i - j + 1;
            } else {
                // 回溯。
                i -= j;
                j = 0;
            }
        }
        return -1;
    }
 解法3: KMP算法
// kmp,计算模式串的pmt数组
    void getNext(const std::string& p, std::vector<int> &next)
    {
        int i = 0;
        int j = -1;
        next[0] = -1;

        while (i < p.size())
        {
            if (j == -1 || p[i] == p[j])
            {
                ++i;
                ++j;
                next[i] = j;
            }
            else
                j = next[j];
        }
    }

    // kmp
    int strStr(std::string haystack, std::string needle) {
        int i = 0;
        int j = 0;
        int nSize = needle.size();

        std::vector<int> next(needle.size() + 1);
        getNext(needle, next);

        while (i < haystack.size() && j < nSize)
        {
            if (j == -1 || haystack[i] == needle[j])
            {
                ++i;
                ++j;
            }
            else
                j = next[j];
        }

        if (j == needle.size())
            return i - j;
        else
            return -1;
    }
 
原文地址:https://www.cnblogs.com/jimobuwu/p/9917045.html