【LeetCode】1668. 最大重复子字符串

给定一个字符串sequence和单词word,求word在sequence中的最大重复值,即word连续出现的最大次数。文章介绍了两种解题方法:一是通过不断拼接word并检查是否仍是sequence的子串;二是使用序列动态规划,计算每个子串与word匹配的最大重复次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题

给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word重复值k 。单词 word 的 最大重复值 是单词 wordsequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k 为 0 。

给你一个字符串 sequenceword ,请你返回 最大重复值 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
  • sequenceword 都只包含小写英文字母

2.解题思路

2.1 解法一:试探

重复拼接word,记为ss,如果sequence仍然包含ss,则重复值k++(k初始为0);否则返回当前k值。详见代码中的解法一。

2.2 解法二:序列DP

定义动态转移方程为:

fif_ifi = fi−mf_{i-m}fim + 1

其中,m为word的长度,fif_ifi 为sequence中长度为m的子串ssiss_issi并与word相等时的最大重复值.
举例:

假设 sequence = “ababc”;word=“ab”;(当前 i=2i<2时,sequence子串长度不够word的长度。即 ss0ss_0ss0ss1ss_1ss1长度不等于2,其对应的 f0f_0f0f1f_1f1 均为 0。)

  • ss2ss_2ss2 =sequence.substring(0, 2);即 ss2ss_2ss2 = “ab”.
    因为 ss2ss_2ss2.equals(word),所以 f2f_2f2 = f0f_0f0 + 1; 其中 f0f_0f0初始值为0.

  • ss3ss_3ss3 =sequence.substring(1, 3);即 ss3ss_3ss3 = “ba”,不等于 word。
    所以 f3f_3f3 还是默认的那个值,为0;

  • ss4ss_4ss4 = sequence.substring(2, 4);即 ss4ss_4ss4 = “ab”,等于 word,
    所以 f4f_4f4 = f2f_2f2 + 1 = 2。

  • ss5ss_5ss5 = sequence.substring(3, 5),即 ss5ss_5ss5 = “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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值