2020-10-21 长按键入

it2023-12-03  72

925. 长按键入

你的朋友正在使用键盘输入他的名字 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 解释:长按名字中的字符并不是必要的。

 

提示:

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

 

 

方法一:双指针

思路与算法

根据题意能够分析得到:字符串 typed 的每个字符,有且只有两种「用途」:

作为 name 的一部分。此时会「匹配」name 中的一个字符

作为长按键入的一部分。此时它应当与前一个字符相同。

如果 typed 中存在一个字符,它两个条件均不满足,则应当直接返回 false;否则,当 typed 扫描完毕后,我们再检查 的每个字符是否都被「匹配」了。

实现上,我们使用两个下标 i,j 追踪和 的位置。

当时,说明两个字符串存在一对匹配的字符,此时将 i,j都加 1。

否则,如果 ,说明存在一次长按键入,此时只将 j 加 1。

最后,如果,说明 的每个字符都被「匹配」了。

class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: i,j = 0,0 while j<len(typed): if i < len(name) and name[i] == typed[j]: i += 1 j += 1 elif j > 0 and typed[j] == typed[j-1]: j += 1 else: return False return i == len(name) class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: if not name and not typed: return True if len(name) * len(typed) == 0:return False last_s = 0 while typed: if name: if name[0] == typed[0]: last_s = name[0] name = name[1:] typed = typed[1:] else: if typed[0] == last_s: typed = typed[1:] else: return False else: for s in typed: if s != last_s:return False break if name: return False return True

方法二:记录重复出现字符长度

记录name和typed分别的连续出现字符长度,只要typed的每个字符长度均大于name,则返回True,否则返回False

最新回复(0)