LeetCode 925. 长按键入 | Python

925. 长按键入


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/long-pressed-name/

题目


你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。

你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True

示例 1:

输入:name = "alex", typed = "aaleex"
输出:true
解释:'alex' 中的 'a' 和 'e' 被长按。

示例 2:

输入:name = "saeed", typed = "ssaaedd"
输出:false
解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。

示例 3:

输入:name = "leelee", typed = "lleeelee"
输出:true

示例 4:

输入:name = "laiden", typed = "laiden"
输出:true
解释:长按名字中的字符并不是必要的。

提示:

  1. name.length <= 1000
  2. typed.length <= 1000
  3. nametyped 的字符都是小写字母。

解题思路


思路:双指针

先看题目,题目中说明 name 是输入正常且正确的部分,而 typed 是指可能输入时字符键入多次,也有可能是输入错误的部分。

在这里,我们需要去匹配判断,typed 究竟是键入多次,还是输入错误。

这里我们可以使用双指针的思路,遍历 typed,与 name 中的字符进行匹配。说下具体的思路:

  • 首先定义双指针 p、q,初始分别指向 name 和 typed 的首字符;
  • 开始比对 p、q 指针所对应的字符:
    • name[p] == typed[q],表示匹配,往后移动指针;
    • name[p] != typed[q],这里需要分情况来判断:
      • 如果 name[p-1] == typed[q],那么表示 typed[q] 是键入多次的字符;
      • 如果 name[p-1] != typed[q] 或者 name[p] 是首元素,也就是 name[p-1] 已经越界时,表示输入错误。
  • 最后,需要确认 name 是否遍历完成,也就是 p 指针是否已经走向末尾。如果 typed 遍历完成,而 name 还未遍历完成,那么表示还有其他字符没有匹配,那么 typed 就是输入错误的情况。

具体的代码实现如下。

class Solution:
    def isLongPressedName(self, name: str, typed: str) -> bool:
        # 定义指针,分别指向 name 和 typed 的首字符
        p = 0
        q = 0

        m = len(name)
        n = len(typed)
        # 遍历 typed 与 name 中的字符比较
        while q < n:
            # 比较,相同移动指针
            if p < m and name[p] == typed[q]:
                p += 1
                q += 1
            # 不相同时,要注意 p 指针指向的元素
            # 如果是首元素,那么表示 name 和 typed 首字符都不同,可以直接返回 False
            # 如果不在首元素,看是否键入重复,键入重复,继续移动 q 指针,继续判断;如果不重复,也就是不相等的情况,直接返回 False,表示输入错误
            elif p > 0 and name[p-1] == typed[q]:
                q += 1
            else:
                return False
        
        # typed 遍历完成后要检查 name 是否遍历完成
        return p == m

复杂度分析

时间复杂度: O ( M + N ) O(M+N) O(M+N) M , N M,N M,N 表示两个字符串的长度。

空间复杂度: O ( 1 ) O(1) O(1)。仅用常数个辅助变量。

欢迎关注


公众号 【书所集录】


如有错误,烦请指正,欢迎指点交流。

你可能感兴趣的:(LeetCode,指针,算法,python,leetcode,双指针)