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 <= 1000
typed.length <= 1000
name
和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