序列 DP
为了方便,我们记 sequence 为 ss,记 word 为 pp,将两者长度分别记为 n 和 m。
同时我们调整「字符串」以及「将要用到的动规数组」的下标从 11 开始。
这是一道入门级的「序列 DP」运用题,容易想到 定义 f[i]f[i] 为了考虑以 ss[i] 结尾时的最大重复值。
不失一般性考虑 f[i]f[i] 该如何转移:由于 pp 的长度已知,每次转移 f[i]f[i] 时我们可以从 ss 中截取 以 ss[i]ss[i] 为结尾,长度为 mm 的后缀字符串 sub 并与 pp 匹配,若两者相等,说明 sub 贡献了大小为 11 的重复度,同时该重复度可累加在 f[i - m]f[i−m] 上(好好回想我们的状态定义),即有状态转移方程:f[i] = f[i - m] + 1f[i]=f[i−m]+1。
最终所有 f[i]f[i] 的最大值即为答案。
class Solution {
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 = 1; i <= n; i++) {
if (i - m < 0) continue;
if (ss.substring(i - m, i).equals(pp)) f[i] = f[i - m] + 1;
ans = Math.max(ans, f[i]);
}
return ans;
}
}