给你一个字符串 sequence 和一个字符串 word,请返回 word 在 sequence 中最大的重复次数。
重复次数 k 表示字符串 word 连续重复 k 次后得到的字符串 word * k 是 sequence 的子字符串。
例如,sequence = "ababc"、word = "ab" 时,"ab" 是 sequence 的子字符串,但 "abab" 也是,所以答案是 2。
dp 数组含义定义一维数组 dp:
这里的 i 表示 sequence 的前 i 个字符,因此 dp[i] 对应 sequence[i - 1] 这个结尾位置。
题目要求整个 sequence 中的最大重复次数,所以最终答案是所有 dp[i] 中的最大值。
如果当前位置不足以容纳一个完整的 word,或者 sequence 从 i - word.length 到 i - 1 的这一段不等于 word,就不能以当前位置结尾形成重复字符串:
如果这一段等于 word,说明可以把一个 word 接到前面的重复字符串后面:
原因是前一个状态表示紧挨着当前 word 之前的最长重复次数,当前又匹配出了一个完整的 word,所以重复次数加 1。
dp 数组如何初始化dp[0] = 0,表示空字符串中没有 word 的重复。
其余位置初始化为 0。如果某个位置无法匹配完整的 word,保持为 0 即可。
当 word 为空字符串时,题目约束通常保证 word 非空;若单独处理该边界,可以直接返回 0,避免取模或截取时产生无意义结果。
dp[i] 依赖 dp[i - word.length],所以必须让 i 从小到大遍历:
这样计算当前状态时,前面紧邻的重复字符串状态已经计算完成。
dp 数组以:
为例,逐个检查以每个位置结尾的长度为 2 的片段:
i | 结尾片段 | dp[i] | 计算过程 | 说明 |
|---|---|---|---|---|
| 0 | - | 0 | 初始化为 0 | 空前缀 |
| 1 | - | 0 | 初始化为 0 | 长度不足 word.length |
| 2 | ab | 1 | dp[0] + 1 = 1 | 匹配一个 word |
| 3 | ba | 0 | 当前片段不等于 word,取 0 | 当前片段不匹配 |
| 4 | ab | 2 | dp[2] + 1 = 2 | 与前一个 ab 连续 |
| 5 | bc | 0 | 当前片段不等于 word,取 0 | 当前片段不匹配 |
| 6 | ca | 0 | 当前片段不等于 word,取 0 | 当前片段不匹配 |
| 7 | ab | 1 | dp[5] + 1 = 1 | 前面没有连续的 word |
最终:
最大值为 2,对应的重复子字符串是 "abab",所以答案是 2。如果 sequence = "ababab",对应的 dp[6] = dp[4] + 1 = 3,答案就是 3。
时间复杂度为 O(n * m),其中 n 是 sequence.length,m 是 word.length;空间复杂度为 O(n)。