1.问题
给你一个字符串 sequence
,如果字符串 word
连续重复 k
次形成的字符串是 sequence
的一个子字符串
,那么单词 word
的 重复值为 k
。单词 word 的 最大重复值 是单词 word
在 sequence
中最大的重复值。如果 word
不是 sequence
的子串,那么重复值 k
为 0 。
给你一个字符串 sequence
和 word
,请你返回 最大重复值 k
。
示例 1
示例 2
示例 3
提示
- 1 <= sequence.length <= 100
- 1 <= word.length <= 100
sequence
和word
都只包含小写英文字母。
2.解题思路
2.1 解法一:试探
重复拼接word
,记为ss
,如果sequence
仍然包含ss
,则重复值k++
(k初始为0);否则返回当前k
值。详见代码中的解法一。
2.2 解法二:序列DP
定义动态转移方程为:
其中,m
为word的长度,
f
i
f_i
fi 为sequence中长度为m
的子串
s
s
i
ss_i
ssi并与word相等时的最大重复值.
举例:
详见代码中解法二。
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;
}
}