LeetCode 题解工作台
找到初始输入字符串 II
Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙,她 可能 在一个按键上按太久,导致一个字符被输入 多次 。 给你一个字符串 word ,它表示 最终 显示在 Alice 显示屏上的结果。同时给你一个 正 整数 k ,表示一开始 Alice 输入字符串的长度 至少 为 k 。 Cre…
3
题型
5
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
长度至少为 ,可以拆分成两个子问题: - 长度不限制,那么每一组连续相同字符的长度都可以选择 到该组长度的任意一个字符,假设方案数为 。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
Alice 正在她的电脑上输入一个字符串。但是她打字技术比较笨拙,她 可能 在一个按键上按太久,导致一个字符被输入 多次 。
给你一个字符串 word ,它表示 最终 显示在 Alice 显示屏上的结果。同时给你一个 正 整数 k ,表示一开始 Alice 输入字符串的长度 至少 为 k 。
请你返回 Alice 一开始可能想要输入字符串的总方案数。
由于答案可能很大,请你将它对 109 + 7 取余 后返回。
示例 1:
输入:word = "aabbccdd", k = 7
输出:5
解释:
可能的字符串包括:"aabbccdd" ,"aabbccd" ,"aabbcdd" ,"aabccdd" 和 "abbccdd" 。
示例 2:
输入:word = "aabbccdd", k = 8
输出:1
解释:
唯一可能的字符串是 "aabbccdd" 。
示例 3:
输入:word = "aaabbb", k = 3
输出:8
提示:
1 <= word.length <= 5 * 105word只包含小写英文字母。1 <= k <= 2000
解题思路
方法一:动态规划 + 前缀和
长度至少为 ,可以拆分成两个子问题:
- 长度不限制,那么每一组连续相同字符的长度都可以选择 到该组长度的任意一个字符,假设方案数为 。
- 长度小于 ,假设方案数为 。
那么最终的方案数为 。
我们可以将字符串 中连续相同的字符分组,由于每组至少选择一个字符,因此,如果一组剩余可选字符大于 ,我们将其加入到一个数组 中。初始选完每一组之后,我们更新剩余的可选字符数 。
如果 ,说明选择每一组的一个字符后,已经满足长度至少为 的要求,此时答案为 。
否则,我们需要计算 的值。我们使用一个二维数组 ,其中 表示前 组字符中,选择 个字符的方案数。初始时 ,表示没有字符时,选择 个字符的方案数为 。那么 ,其中 为 的长度。答案为 。
考虑 的转移方程。对于第 组字符,假设其剩余长度为 ,对于每个 ,我们可以枚举选择该组的字符数 ,那么 。此时, 可以由 转移而来。我们可以使用前缀和来优化这个转移过程。
时间复杂度 ,空间复杂度 ,其中 为字符串 的长度。
class Solution:
def possibleStringCount(self, word: str, k: int) -> int:
mod = 10**9 + 7
nums = []
ans = 1
cur = 0
for i, c in enumerate(word):
cur += 1
if i == len(word) - 1 or c != word[i + 1]:
if cur > 1:
if k > 0:
nums.append(cur - 1)
ans = ans * cur % mod
cur = 0
k -= 1
if k < 1:
return ans
m = len(nums)
f = [[0] * k for _ in range(m + 1)]
f[0][0] = 1
for i, x in enumerate(nums, 1):
s = list(accumulate(f[i - 1], initial=0))
for j in range(k):
f[i][j] = (s[j + 1] - s[j - min(x, j)] + mod) % mod
return (ans - sum(f[m][j] for j in range(k))) % mod
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n + k^2) |
| 空间 | O(k) |
面试官常问的追问
外企场景- question_mark
Looking for understanding of dynamic programming with state transitions.
- question_mark
Tests problem-solving skills in reducing complexity by optimizing state transitions.
- question_mark
Evaluates how well the candidate handles constraints and optimizes large inputs.
常见陷阱
外企场景- error
Failing to handle large input sizes efficiently, resulting in time complexity issues.
- error
Not utilizing prefix sums to optimize dynamic programming transitions.
- error
Misunderstanding the transition state and incorrectly counting valid subsequences.
进阶变体
外企场景- arrow_right_alt
Implementing a solution with different constraints, like a different maximum length for word.
- arrow_right_alt
Reducing the value of k and testing the edge cases for smaller inputs.
- arrow_right_alt
Applying the same approach to variations of this problem, like different typing mistakes or different characters.