LeetCode28. 实现 strStr()

1.问题描述

给定一个 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() 定义相符。

2.问题分析

代码中所求的kmp[i]中数组表示的是前i个字符的最大真前后缀。我们在使用这个数组进行kmp算法的匹配的时候,要注意一个地方,如果我们在匹配途中失配,那么需要j=kmp[j-1]而不是j=kmp[j],因为在j处匹配失败,那么我们下次匹配的位置正好是前j-1个字符的最大真公共前后缀。还有一点,就是什么情况我们的主串指针不后移:
主串模式串单字符匹配失败,模式串需要调整匹配位置
其他情况主串的匹配后移

3.代码实现

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(haystack.length()==0&&needle.length()==0)
        return 0;
        if(needle.length()==0)
        return 0;
        if(haystack.length()==0)
        return -1;
        int kmp[needle.length()];
        kmp[0]=0;
        int j=-1;
        for(int i=1;i<needle.length();i++)
        {
            while(j>-1&&needle[j+1]!=needle[i])
            {
                if(j==0)//j==0的时候陷入死循环
                {
                    j=-1;
                    break;
                }
                else
                j=kmp[j]-1;
            }
              if(needle[i]==needle[j+1])
                j++;
            kmp[i]=j+1;
        }
        int i=0;
        j=0;
        int flag;
        while(i<haystack.length())
        {
            flag=0;
            if(haystack[i]==needle[j])
            {
              i++;
              j++;
              flag=1;
            }
            else 
            {
                if(j>0)
              {
                j=kmp[j-1];
                flag=1}
            }
            if(j==needle.length())
            return i-needle.length();     
            if(flag==0)
            i++;
        } 
        return -1;

    }
};

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107737317