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;
};
原文地址:https://www.cnblogs.com/lanpang9661/p/12761373.html