LeetCode 925. Long Pressed Name

文章讲述了如何编写一个程序,检查输入的姓名字符串中,是否存在因按键长时间按压导致的字符重复,如例1中的alexaaleex。作者提供了一种解决方案,使用双指针和计数器来确定字符在两个字符串中出现次数的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Your friend is typing his name into a keyboard. Sometimes, when typing a character c, the key might get long pressed, and the character will be typed 1 or more times.

You examine the typed characters of the keyboard. Return True if it is possible that it was your friends name, with some characters (possibly none) being long pressed.

Example 1:

Input: name = "alex", typed = "aaleex"
Output: true
Explanation: 'a' and 'e' in 'alex' were long pressed.

Example 2:

Input: name = "saeed", typed = "ssaaedd"
Output: false
Explanation: 'e' must have been pressed twice, but it was not in the typed output.

Constraints:

  • 1 <= name.length, typed.length <= 1000
  • name and typed consist of only lowercase English letters.

这题给了两个string,其中一个是原字符串,另一个是原字符串中某个字符可能连续出现了多次,要求第二个字符串符不符合这个条件。

嗯,第一反应其实就是two pointers拿两个pointer分别指向name和typed,判断是否一样,以及如果typed里这个字符连续出现多次就pointer++跳过。于是显然忘了name里也可能出现两个一样的字符连在一起的情况。然后就开始各种if写了起来,而且因为p++和p + 1的时候特别容易出现边界条件的问题,所以就越写越乱,思路也乱代码也乱,就是一团糟了。

于是一气之下决定重写,用同样的方法计算每个连续的字符分别在两个string里出现了几次,如果name里出现的次数少于typed里出现的次数那就显然不符合条件。最后两个都会在字符串末尾结束,如果没有同时在字符串末尾结束的话就说明不符合条件了。这样写出来的代码非常直观而且不容易出错,没什么corner cases,喜欢。但是效率的话打败了70%,其实也还行了,对于自己硬写出来的已经满意了。

观察了一下大家的做法,其实也都大差不差,而且很多也都挺复杂,corner case太烦了,遂放弃,满足于自己写的了。

class Solution {
    public boolean isLongPressedName(String name, String typed) {
        int p1 = 0;
        int p2 = 0;
        while (p1 < name.length() && p2 < typed.length()) {
            if (name.charAt(p1) != typed.charAt(p2)) {
                return false;
            }
            int typedRepeat = 0;
            while (p2 < typed.length() - 1 && typed.charAt(p2) == typed.charAt(p2 + 1)) {
                p2++;
                typedRepeat++;
            }
            int nameRepeat = 0;
            while (p1 < name.length() - 1 && name.charAt(p1) == name.charAt(p1 + 1)) {
                p1++;
                nameRepeat++;
            }
            if (typedRepeat < nameRepeat) {
                return false;
            }
            p1++;
            p2++;
        }
        return p1 == name.length() && p2 == typed.length();
    }
}

其实这个解法还挺有意思的,计算了两个字符串之间的差,看代码也没啥太多corner case:LeetCode - The World's Leading Online Programming Learning Platform

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值