长按键入

标签: 双指针 字符串

难度: Easy

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= name.length, typed.length <= 1000
  • name 和 typed 的字符都是小写字母

Submission

运行时间: 23 ms

内存: 15.9 MB

class Solution:
    def isLongPressedName(self,name,typed):
        left_1, left_2 =0, 0
        while left_1 < len(name) and left_2 < len(typed):
            if name[left_1] == typed[left_2]:
                left_1 += 1
                left_2 += 1
            elif left_2 > 0 and typed[left_2 - 1] == typed[left_2]:
                left_2 += 1
            else:
                return False
        while 0 < left_2 < len(typed) and typed[left_2] == typed[left_2 - 1]:
            left_2 += 1
        if left_1 == len(name) and left_2 == len(typed):
            return True
        else:
            return False

Explain

该题解采用了双指针方法来比较两个字符串。其中,left_1 指针遍历 name 字符串,left_2 指针遍历 typed 字符串。当两个指针指向的字符相同,两个指针同时向前移动。如果不同,检查当前 typed 中的字符是否与前一个字符相同(表示长按),如果是,则 left_2 向前移动,否则返回 False。在遍历完 name 后,还需要检查 typed 中剩余的字符是否为长按的字符。如果最终 left_1 和 left_2 都能遍历完各自的字符串,则返回 True,表示 typed 可能是 name 的长按形式。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def isLongPressedName(self, name, typed):
        left_1, left_2 = 0, 0  # 初始化两个指针,分别指向 name 和 typed 的起始位置
        while left_1 < len(name) and left_2 < len(typed):
            if name[left_1] == typed[left_2]:  # 当两个指针指向的字符相同
                left_1 += 1  # 两个指针同时向前移动
                left_2 += 1
            elif left_2 > 0 and typed[left_2 - 1] == typed[left_2]:  # 检查是否为长按键入
                left_2 += 1  # 只移动 typed 的指针
            else:
                return False  # 字符不同且不是长按情况,直接返回 False
        while 0 < left_2 < len(typed) and typed[left_2] == typed[left_2 - 1]:  # 检查剩余的 typed 是否为长按的字符
            left_2 += 1
        if left_1 == len(name) and left_2 == len(typed):  # 检查是否完整遍历了 name 和 typed
            return True
        else:
            return False

Explore

在这种情况下,如果在遍历`typed`的过程中发现`typed`中的字符与`name`中当前指向的字符不同,并且无法通过长按前一个字符来解释此差异(即`typed`中的字符不等于其前一个字符或者`typed`的指针已经是在第一个字符),程序则会返回`False`。这样可以确保`typed`中不会出现`name`中不存在的字符。

在这种情况下,没有必要继续检查`typed`中的剩余内容。一旦发现`typed`中的字符与`name`不匹配,并且不能通过长按的方式来解释这种不匹配(即当前`typed`字符不等于它的前一个字符),就已经可以断定`typed`不是`name`的长按版本,因此可以直接返回`False`。

在遍历完`name`之后,程序会继续检查`typed`中剩余的字符。这些字符必须是`typed`中最后一个与`name`匹配的字符的重复(长按)。验证方法是检查剩余的每个字符是否与`typed`中前一个字符相同。如果在某个点,剩余字符不再与前一个字符相同,则这些字符不符合长按的格式,此时程序应返回`False`。这确保了`typed`完全由`name`字符的长按形式构成。

双指针方法通过严格比较`name`和`typed`中的字符来确保匹配。当两个指针指向的字符相同时,两个指针同时移动。如果字符不同,则检查`typed`中的字符是否为其前一个字符的重复(即长按)。这种方法确保了每个`typed`中的字符都能对应到`name`中的某个字符,或者是由`name`中某个字符的长按产生的。任何不符合这些条件的字符都会导致方法返回`False`,从而确保`typed`字符的合法性。