0466. 统计重复个数
大约 3 分钟
---
0466. 统计重复个数
- 标签:字符串、动态规划
- 难度:困难
题目链接
题目大意
描述:
定义 表示 由 个字符串 连接构成。
- 例如,
str == ["abc", 3] == "abcabcabc"。
如果可以从 中删除某些字符使其变为 ,则称字符串 可以从字符串 获得。
- 例如,根据定义,
s1 = "abc"可以从s2 = "abdbec"获得,仅需要删除加粗且用斜体标识的字符。
现在给定两个字符串 和 和两个整数 和 。由此构造得到两个字符串,其中 、。
要求:
请你找出一个最大整数 ,以满足 可以从 获得。
说明:
- 。
- 和 由小写英文字母组成。
- 。
示例:
- 示例 1:
输入:s1 = "acb", n1 = 4, s2 = "ab", n2 = 2
输出:2- 示例 2:
输入:s1 = "acb", n1 = 1, s2 = "acb", n2 = 1
输出:1解题思路
思路 1:模拟匹配
- 我们需要找到最大的整数 ,使得 重复 次后得到的字符串可以从 重复 次后得到的字符串中获得。
- 由于 和 可能很大(最大 ),直接构造完整字符串会超出内存限制。
- 我们可以通过模拟匹配过程来解决:遍历 的每个字符,尝试匹配 的字符。
- 使用两个指针 和 ,分别指向 和 的当前位置。
- 当 时, 指针前进;否则只前进 指针。
- 当 指针到达 末尾时,说明完成了一次 的匹配,计数器加 , 重置为 。
- 重复这个过程直到遍历完 个 ,统计总共能匹配多少个完整的 。
- 最终答案是 。
思路 1:代码
class Solution:
def getMaxRepetitions(self, s1: str, n1: int, s2: str, n2: int) -> int:
# 统计在 n1 个 s1 中能匹配多少个完整的 s2
s2_count = 0 # 匹配的 s2 个数
s2_index = 0 # s2 的当前匹配位置
# 遍历 n1 个 s1
for i in range(n1):
# 遍历当前 s1 的每个字符
for char in s1:
# 如果当前字符匹配 s2 的当前字符
if char == s2[s2_index]:
s2_index += 1
# 如果匹配完一个完整的 s2
if s2_index == len(s2):
s2_count += 1
s2_index = 0 # 重置 s2 的匹配位置
# 返回能构造多少个 [s2, n2]
return s2_count // n2思路 1:复杂度分析
- 时间复杂度:,其中 是字符串 的长度。需要遍历 个 ,每个 需要遍历其所有字符。
- 空间复杂度:,只使用了常数额外空间。