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


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

定义动态转移方程为:

$f_i$ = $f_{i-m}$ + 1

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

假设 sequence = “ababc”;word=”ab”;(当前 i=2i<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;
    }
}

文章作者: Kezade
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kezade !
评论
  目录