🌈【LeetCode 925. 长按键入 】- JavaScript(双指针+正则)

189 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 925. 长按键入 】- JavaScript(双指针+正则)

题意描述

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

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

示例 1:

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

示例 2:

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

思路分析:

OS:不会打字就不要打,按键盘都能摁歪来?建议去医院看看看

恶心的是这个题目的核心思路:面向测试用例编程。 为什么这么说呢?我们来看下这三个例子:

  1. 输入:name = "alex", typed = "aaleex"
  2. 输入:name = "saeed", typed = "ssaaedd"
  3. 输入:name = "alex", typed = "aaleexa" 首先,大体的思路很好确定,双指针。这里比较麻烦的就是确定双指针的细节,而这些细节就体现在这三个例子中。
  4. 例子1,正常的长按的处理
  5. 例子2,要考虑name里面也会出现连续的相同的字母
  6. 例子3,要考虑name和typed就不是长按的那种关系。

双指针

核心思想:同时滑动,遇到不同的看是否和name前一个相同,是就滑一下typed的指针

var isLongPressedName = function(name, typed) {
   let i = 0;
   let j = 0;

    while (i < name.length || j < typed.length) {
      if (name[i] === typed[j]) {
        i++;
        j++;
      } else if (name[i] !== typed[j] && i > 0 && name[i - 1] === typed[j]) {
        j++;
      } else {
        return false;
      }
    }
    return true;
};

正则

坑还是比较多,所以在做正则规则的时候要小心,这题坑太多,总的来说一句话,两个字符串除了字符的个数可以不同(这里的可以是对于正常进行判断来说),其他的不允许有任何不同,否则均为false。

var isLongPressedName = function (name, typed) {
 RegExp("^"+Array.from(name).join('+')+"+$").test(typed);
    if (!name.length) {
        return !typed.length;
    }
    let reg = '^';
    let last = name[0];
    let c = 1;
    for (let i = 1; i < name.length; i++) {
        if (last === name[i]) {
            c++;
        } else {
            reg += `[${last}]{${c},}`
            last = name[i];
            c = 1;
        }
    }
    reg += `[${last}]{${c},}$`
    return new RegExp(reg).test(typed);
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤