1668. 最大重复子字符串

80 阅读1分钟

1668. 最大重复子字符串

easy,但是可以有很多不同的想法

方法一:暴力

class Solution:
    def maxRepeating(self, sequence: str, word: str) -> int:
        res = 0
        while (res * word) in sequence:
            res += 1
        res -= 1
        return res

方法二:暴力枚举+DP

    def maxRepeating(self, sequence: str, word: str) -> int:
        n, m = len(sequence), len(word)
        if n < m:
            return 0
        dp = [0] * n
        for i in range(m - 1, n):
            flag = True
            for j in range(m):
                if sequence[i - m + j + 1] != word[j]:
                    flag = False
            if flag:
                dp[i]  = (0 if i == m - 1 else dp[i - m]) + 1
        return max(dp)

方法三:KMP+DP

复习-Pecco KMP

class Solution {
public:
    int maxRepeating(string sequence, string word) {
        if (sequence.empty() || word.empty()) return 0;
        int res = 0;
        string pattern = word;
        while (kmp(sequence, pattern) != -1) ++res, pattern += word;
        return res;
    }

    int kmp(string& str, string& pattern) {
        if (str.empty() || pattern.empty()) return -1;
        vector<int> nxt = getNextArray(pattern);
        int j = 0;
        for (int i = 0, n = str.length(); i < n; ++i) {
            while (j > 0 && str[i] != pattern[j]) j = nxt[j];
            if (str[i] == pattern[j]) ++j;
            if (j == pattern.length()) return i - j + 1;
        }
        return -1;
    }

    vector<int> getNextArray(string& pattern) {
        if (pattern.empty()) return {};
        vector<int> nxt(pattern.length());
        int j = 0;
        for (int i = 2, n = pattern.length(); i < n; ++i) {
            while (j > 0 && pattern[j] != pattern[i - 1]) j = nxt[j];
            if (pattern[j] == pattern[i - 1]) ++j;
            nxt[i] = j;
        }
        return nxt;
    }
};