给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

 


class Solution {
public:
    int strStr(string haystack, string needle) {
        // sunday算法
        if(needle.size()>haystack.size())
            return -1;

        // 建立索引表
        unordered_map<char,int> post_nee;
        for(int i=needle.size()-1;i>=0;i--){
            if(post_nee.find(needle[i])==post_nee.end())
                post_nee[needle[i]]=needle.size()-i;
        }

        // sunday匹配
        int i=0;
        int m=haystack.size();
        int n=needle.size();
        while(i<=m-n){
            int j=0;
            // 匹配
            while(j<n && haystack[i+j]==needle[j])
                j++;
            
            // 如果匹配成功,返回i
            if(j==n)
                return i;
            // 如果直到遍历完依旧匹配不成功,返回-1
            if(i+n >= m)
                return -1;
            
            char next_char=haystack[i+n];
            // 如果next_chat存在
            if(post_nee.find(next_char)!=post_nee.end())
                i += post_nee[next_char];
            // 如果不存在
            else
                i += n+1;
        }
        return -1;
    }
};