返回

算法每日一练:长按键入(LeetCode 101)

Android

算法每日一练:长按键入(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. 定义一个滑动窗口,初始时窗口大小为 1,窗口中只包含第一个字符。
  2. 遍历字符串 name,对于每个字符 c,如果 c 与窗口中的最后一个字符相同,则将窗口大小加 1;否则,创建一个新的窗口,窗口大小为 1,窗口中只包含字符 c。
  3. 对于每个窗口,如果窗口大小大于或等于 k,则窗口中的字符被长按,我们需要计算窗口中的字符实际输入的次数。字符实际输入的次数等于窗口大小,减去 k。
  4. 将窗口中的字符实际输入次数累加到结果中。

代码实现

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 的长度。

总结

这道题考察了我们使用滑动窗口解决问题的能力。通过使用滑动窗口,我们可以有效地计算每个字符实际输入的次数,并返回这个数字。