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
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;
}
};