一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【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:不会打字就不要打,按键盘都能摁歪来?建议去医院看看看
恶心的是这个题目的核心思路:
面向测试用例编程。 为什么这么说呢?我们来看下这三个例子:
输入:name = "alex", typed = "aaleex"输入:name = "saeed", typed = "ssaaedd"输入:name = "alex", typed = "aaleexa"首先,大体的思路很好确定,双指针。这里比较麻烦的就是确定双指针的细节,而这些细节就体现在这三个例子中。- 例子1,正常的长按的处理
- 例子2,要考虑name里面也会出现连续的相同的字母
- 例子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);
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤