2020-10-21 长按键入

本文介绍了如何解决925. 长按键入的问题,提供了两种方法:双指针和记录重复出现字符长度。通过分析字符串typed和name,判断在长按键入的情况下,typed是否可能是name的正确输入。
摘要由CSDN通过智能技术生成

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
解释:长按名字中的字符并不是必要的。

 

提示:

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

 

 

方法一:双指针

思路与算法

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

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

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

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

实现上,我们使用两个下标 i,j 追踪\textit{name}\textit{typed}的位置。

\textit{name}[i]=\textit{typed}[j]时,说明两个字符串存在一对匹配的字符,此时将 i,j都加 1。

否则,如果 \textit{typed}[j]=\textit{typed}[j-1],说明存在一次长按键入,此时只将 j 加 1。

最后,如果i=\textit{name}.\textit{length},说明 \textit{name}的每个字符都被「匹配」了。

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值