代码随想录刷题第九天

今天碰到硬骨头了。第一题是找字符串的匹配项https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/,遇上了大名鼎鼎的KMP算法,我只能缴械投降了,赶紧请来卡哥帮忙代码随想录。没太听懂,看看题解。大概理解了,kmp事实上是避免了对字符串内重复信息的多次匹配,从而大大提高了算法效率。

class Solution {
public:
    void getNext(int* next, const string& s){
        int j = 0;
        next[0] = 0;
        for(int i = 1; i < s.size(); i++){
            while(j > 0 && s[i] != s[j]){
                j = next[j - 1];
            }
            if(s[i] == s[j]) j++;
            next[i] = j;
        }
    }
    int strStr(string haystack, string needle) {
    if (needle.size() == 0) return 0;
    int next[needle.size()];
    getNext(next, needle);
    int j = 0;
    for(int i = 0; i < haystack.size(); i++){
        while(j > 0 && haystack[i] != needle[j]){
            j = next[j - 1];
        }
        if(haystack[i] == needle[j]) j++;
        if (j == needle.size()){
            return (i - needle.size() + 1);
        }
    }
    return -1;
    }
};

说实在的,有点抽象。

第二题是重复子串https://leetcode.cn/problems/repeated-substring-pattern/description/,还是求助卡哥代码随想录,有两种思路,其中用主串拼接再得主串的想法惊艳到我了,很巧妙。

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
    string t = s + s;
    t.erase(t.begin());
    t.erase(t.end() - 1);
    if (t.find(s) != std::std::npos) return true;
    return false;
    }
};

简洁的代码。kmp的实在不明白,先放一放了。算是草草的结束了字符串,留下了KMP的遗憾。

双指针的方法像一把钥匙,让人感觉奇妙。开心的是终于要到栈了,win

你可能感兴趣的:(leetcode)