返回
算法每日一练:长按键入(LeetCode 101)
Android
2023-12-30 05:44:37
算法每日一练:长按键入(LeetCode 101)
前言
欢迎来到算法每日一练系列,在这里,我们将每天一起解决一道算法题,提升我们的编程能力。今天,我们要挑战的是 LeetCode 101:长按键入。
原题样例:长按键入
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,这将导致连续输入多个字符 c。例如,如果键入 "a" 并长按 "2",那么输入的字符串将是 "aa"。
给你一个字符串 name 和一个整数 k,其中 k 是按键长按时可能连续输入的最多字符数。你的任务是计算他名字中字符的实际输入次数,并返回这个数字。
示例 1:
输入:name = "alex", k = 2
输出:4
解释:朋友的名字是 "alex",如果长按 "l" 或 "x",最多可以连续输入 2 个字符。
示例 2:
输入:name = "saeed", k = 4
输出:5
解释:朋友的名字是 "saeed",如果长按 "e" 或 "d",最多可以连续输入 4 个字符。
算法分析
这道题的重点在于计算每个字符实际输入的次数。我们可以使用一个滑动窗口来实现这个目的。
- 定义一个滑动窗口,初始时窗口大小为 1,窗口中只包含第一个字符。
- 遍历字符串 name,对于每个字符 c,如果 c 与窗口中的最后一个字符相同,则将窗口大小加 1;否则,创建一个新的窗口,窗口大小为 1,窗口中只包含字符 c。
- 对于每个窗口,如果窗口大小大于或等于 k,则窗口中的字符被长按,我们需要计算窗口中的字符实际输入的次数。字符实际输入的次数等于窗口大小,减去 k。
- 将窗口中的字符实际输入次数累加到结果中。
代码实现
def long_pressed_name(name, k):
"""
计算长按键入的字符实际输入次数。
Args:
name: 朋友的名字。
k: 按键长按时可能连续输入的最多字符数。
Returns:
字符实际输入的次数。
"""
# 定义滑动窗口,初始时窗口大小为 1,窗口中只包含第一个字符。
window = [name[0]]
# 遍历字符串 name。
for c in name[1:]:
# 如果 c 与窗口中的最后一个字符相同,则将窗口大小加 1。
if c == window[-1]:
window.append(c)
# 否则,创建一个新的窗口,窗口大小为 1,窗口中只包含字符 c。
else:
window = [c]
# 计算每个窗口中的字符实际输入次数。
result = 0
for window in windows:
if len(window) >= k:
result += len(window) - k + 1
else:
result += len(window)
return result
# 测试代码。
print(long_pressed_name("alex", 2)) # 4
print(long_pressed_name("saeed", 4)) # 5
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串 name 的长度。
- 空间复杂度:O(n),其中 n 是字符串 name 的长度。
总结
这道题考察了我们使用滑动窗口解决问题的能力。通过使用滑动窗口,我们可以有效地计算每个字符实际输入的次数,并返回这个数字。