925.长按键入
2020-04-23
长按键入
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,
按键可能会被长按,而字符可能被输入 1 次或多次。
你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字
(其中一些字符可能被长按),那么就返回 True。
题解:
思路1:按块分组
对于字符串 S = 'aabbbbccc',可以把表示成这种分组形式 - groupify(S) = [['a', 2], ['b', 4], ['c', 3]],
其中 'abc' 为 键值,[2, 4, 3] 为连续出现的次数。
对于一个长按键入的 typed 来说,依次每个字母连续出现的次数一定大于等于 name 中连续字母出现的次数。
举个例子,'aaleex' 是 'alex' 其中一种长按键入的名字: 首先把它们分别变成
[['a', 2], ['l', 1], ['e', 2], ['x', 1]] 和 [['a', 1], ['l', 1],['e', 1], ['x', 1]] 的形式,
这两个字符串的键值都是 'alex',同时 [2,1,2,1] 也分别大于 [1,1,1,1]((2 >= 1, 1 >= 1, 2 >= 1, 1 >= 1))。
var isLongPressedName = function (name, typed) { let nameArr = [], typedArr = [], tmp = [], len = 1; for (let i = 0; i < name.length; i++) { // nameArr 将name字符串分组 if (name[i] === name[i + 1] && i < name.length - 1) { len++; continue; } tmp = [name[i], len]; len = 1; // 如果下一项与这一项不相等 将tmp放入到数组中 len重置为1 nameArr.push(tmp); } for (let i = 0; i < typed.length; i++) { // typedArr 将name字符串分组 if (typed[i] === typed[i + 1] && i < typed.length - 1) { len++; continue; } tmp = [typed[i], len]; len = 1; typedArr.push(tmp); } if (nameArr.length !== typedArr.length) return false; // 如果两个分块数组长度不一样 肯定是不对的 // 判断每一项的第0项是否相等 第1项是否是typedarr 大于等于 namearr for (let i = 0; i < nameArr.length; i++) { if (!(nameArr[i][0] === typedArr[i][0] && nameArr[i][1] <= typedArr[i][1])) return false; } return true; };