leetcode459. 重复的子字符串(KMP)

一:题目

leetcode459. 重复的子字符串(KMP)_第1张图片

二:上码


class Solution {
public:
    /**
        思路:
                a b c a b c a b c a b  c
        next[i] 0 0 0 1 2 3 4 5 6 7 8  9
             i  0 1 2 3 4 5 6 7 8 9 10 11   
        length:12
        next[length-1]:next[11] = 9

        length - next[length-1] = 3;//求出我们的单个字符串

        如果length % (length - next[length-1]) == 0 那么的话 我们就可以确定我们有多少个字符串。
    
    */
    
    //求出前缀表
    void getIndex(int *next,string s) {
        int j = 0;//前缀表的末尾
        next[0] = 0;//只有一个字符的

        for (int i = 1; i < s.size(); i++) {//i是后缀表的末尾

            while (j > 0 && s[i] != s[j]) {//处理字符不一致的问题
                j = next[j-1];            //找前一个元素对应的最长公共前后缀 作为其下标 再进行匹配    
            }
            if (s[i] == s[j]) j++;
            next[i] = j;//处理子串对应的最长公共前后缀
        }
    }

    bool repeatedSubstringPattern(string s) {
        
        if (s.size() == 0) return false;

        int next[s.size()];
        getIndex(next,s);
        int length = s.size();

        //保证我们的包含最后一个元素的子串是有最长公共前后缀的
        //

        if ( next[length-1] != 0 && length % (length - next[length-1]) == 0) {
            return true;
        }

        return false;
    }
};


你可能感兴趣的:(leetcode复习题目,算法分析与设计,leetcode,冲刺秋招)