1.问题
给你一个字符串 sequence
,如果字符串 word
连续重复 k
次形成的字符串是 sequence
的一个子字符串
,那么单词 word
的 重复值为 k
。单词 word 的 最大重复值 是单词 word
在 sequence
中最大的重复值。如果 word
不是 sequence
的子串,那么重复值 k
为 0 。
给你一个字符串 sequence
和 word
,请你返回 最大重复值 k
。
示例 1
输入:sequence = “ababc”, word = “ab”
输出:2
解释:”abab” 是 “ababc” 的子字符串。
示例 2
输入:sequence = “ababc”, word = “ba”
输出:1
解释:”ba” 是 “ababc” 的子字符串,但 “baba” 不是 “ababc” 的子字符串。
示例 3
输入:sequence = “ababc”, word = “ac”
输出:0
解释:”ac” 不是 “ababc” 的子字符串。
提示
- 1 <= sequence.length <= 100
- 1 <= word.length <= 100
sequence
和word
都只包含小写英文字母。
2.解题思路
2.1 解法一:试探
重复拼接word
,记为ss
,如果sequence
仍然包含ss
,则重复值k++
(k初始为0);否则返回当前k
值。详见代码中的解法一。
2.2 解法二:序列DP
定义动态转移方程为:
$f_i$ = $f_{i-m}$ + 1
其中,m
为word的长度,$f_i$ 为sequence中长度为m
的子串$ss_i$并与word相等时的最大重复值.
举例:
假设 sequence = “ababc”;word=”ab”;(当前
i=2
,i<2
时,sequence子串长度不够word的长度。即 $ss_0$,$ss_1$长度不等于2,其对应的 $f_0$、$f_1$ 均为 0。)
则 $ss_2$ =sequence.substring(0, 2);即 $ss_2$ = “ab”.
因为 $ss_2$.equals(word),所以 $f_2$ = $f_0$ + 1; 其中 $f_0$初始值为0.又 $ss_3$ =sequence.substring(1, 3);即 $ss_3$ = “ba”,不等于 word。
所以 $f_3$ 还是默认的那个值,为0;又 $ss_4$ = sequence.substring(2, 4);即 $ss_4$ = “ab”,等于 word,
所以 $f_4$ = $f_2$ + 1 = 2。又 $ss_5$ = sequence.substring(3, 5),即 $ss_5$ = “bc”,不等于 word。
遍历完毕,最大重复值为 2。
详见代码中解法二。
3.代码
class Solution {
//解法一
public int maxRepeating(String sequence, String word) {
int k=0;
StringBuilder sb=new StringBuilder(word);
while (sequence.contains(sb)){
//叠加后仍然包含,重复值+1
k++;
//叠加word
sb.append(word);
}
return k;
}
//解法二
public int maxRepeating(String ss, String pp) {
int n = ss.length(), m = pp.length(), ans = 0;
int[] f = new int[n + 10];
for (int i = m; i <= n; i++) {
if (ss.substring(i - m, i).equals(pp)) {
f[i] = f[i - m] + 1;
}
ans = Math.max(ans, f[i]);
}
return ans;
}
}