每日一题——最大重复子字符串

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值