给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为k **** 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k 为 0 。
这里 f[i] 表示字符串 word 在第 i 个位置最后一次出现时的最大重复值,那么只有在 valid}[i] 为 1 时最大重复值才不为 0,需要进行递推。字符串 word 在第 i 个位置前出现的最大重复值可以通过 f[i-|\textit{word}|] 获得(其中 |\textit{word}| 表示字符串 word 的长度),如果该项没有意义,那么它的值为 0。
最终的答案即为数组 f 中的最大值。注意到在求解 f[i] 时,我们无需存储除了 valid}[i] 以外的数组 valid 的项。因此可以省去数组 valid。
publicclassSolution { publicintMaxRepeating(string sequence, string word) { int n = sequence.Length, m = word.Length; if (n < m) { return0; }
int[] f = newint[n]; for (int i = m - 1; i < n; ++i) { bool valid = true; for (int j = 0; j < m; ++j) { if (sequence[i - m + j + 1] != word[j]) { valid = false; break; } } if (valid) { f[i] = (i == m - 1 ? 0 : f[i - m]) + 1; } }
return f.Max(); } }
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defmaxRepeating(self, sequence: str, word: str) -> int: n, m = len(sequence), len(word) if n < m: return0 f = [0] * n for i inrange(m - 1, n): valid = True for j inrange(m): if sequence[i - m + j + 1] != word[j]: valid = False break if valid: f[i] = (0if i == m - 1else f[i - m]) + 1 returnmax(f)
intmaxRepeating(char * sequence, char * word){ int n = strlen(sequence), m = strlen(word); if (n < m) { return0; }
int f[n]; memset(f, 0, sizeof(f)); for (int i = m - 1; i < n; ++i) { bool valid = true; for (int j = 0; j < m; ++j) { if (sequence[i - m + j + 1] != word[j]) { valid = false; break; } } if (valid) { f[i] = (i == m - 1 ? 0 : f[i - m]) + 1; } } int res = 0; for (int i = 0; i < n; i++) { res = MAX(res, f[i]); } return res; }
funcmaxRepeating(sequence, word string) (ans int) { n, m := len(sequence), len(word) if n < m { return } f := make([]int, n) for i := m - 1; i < n; i++ { if sequence[i-m+1:i+1] == word { if i == m-1 { f[i] = 1 } else { f[i] = f[i-m] + 1 } if f[i] > ans { ans = f[i] } } } return }
funcmaxRepeating(sequence, word string) (ans int) { n, m := len(sequence), len(word) if n < m { return } fail := make([]int, m) for i := range fail { fail[i] = -1 } for i := 1; i < m; i++ { j := fail[i-1] for j != -1 && word[j+1] != word[i] { j = fail[j] } if word[j+1] == word[i] { fail[i] = j + 1 } }
f := make([]int, n) j := -1 for i := 0; i < n; i++ { for j != -1 && word[j+1] != sequence[i] { j = fail[j] } if word[j+1] == sequence[i] { j++ if j == m-1 { if i < m { f[i] = 1 } else { f[i] = f[i-m] + 1 } if f[i] > ans { ans = f[i] } j = fail[j] } } } return }
复杂度分析
时间复杂度:O(m + n),其中 n 和 m 分别是字符串 sequence 和 word 的长度。