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 wasn't in the typed output.

Example 3:

Input: name = "leelee", typed = "lleeelee"
Output: true

Example 4:

Input: name = "laiden", typed = "laiden"
Output: true
Explanation: It's not necessary to long press any character.

Note:

  1. name.length <= 1000
  2. typed.length <= 1000
  3. The characters of name and typed are lowercase letters.

这道题说是你朋友在用键盘敲入名字的时候,对于某个字母可能会长时间按键,这导可能会有多个相同字母输入,这种情况是允许的,现在给了两个字符串,name 是朋友的名字,typed 是朋友敲入的字符串,问 typed 是否是朋友敲入的名字。其实这道题的本质是,对于 name 中每个位置的字母,对应在 typed 中的出现次数一定要相等或者更多,但是直接统计每个字符出现的次数是不对的,因为位置关系很重要,比如 abb 和 abab,虽然后者中a和b的出现次数都大于等于前者,但还是要返回 false。博主最先想的方法是用两个指针i和j分别提取 name 和 typed 字符串中每个字母出现的次数,如果 typed 中的次数小于 name 中的次数,则直接返回 false 即可,最终循环结束后,i和j应该分别为 name 和 typed 的长度,此时返回 true,否则返回 false,参见代码如下:


解法一:

class Solution {
public:
bool isLongPressedName(string name, string typed) {
int i = 0, j = 0, m = name.size(), n = typed.size();
while (i < m || j < n) {
int start1 = i, start2 = j;
while (i < m - 1 && name[i] == name[i + 1]) ++i;
while (j < n - 1 && typed[j] == typed[j + 1]) ++j;
if (j - start2 + 1 < i - start1 + 1) return false;
++i; ++j;
}
return i == m && j == n;
}
};

可以写的简洁一些,不需要使用那么多的 while 循环,而是直接用j遍历 typed 中每个字母,i初识时指向 name 的第一个字母,假如i小于m,且 name[i] 等于 typed[j-1] 时,则i自增1,否则的话,若此时j为0(说明第一个字母就不匹配),或者 typed[j] 不等于 typed[j - 1](说明出现了无法匹配的新字母),则直接返回 false。循环退出后若i等于m则返回 true,否则返回 false,参见代码如下:


解法二:

class Solution {
public:
bool isLongPressedName(string name, string typed) {
int i = 0, m = name.size(), n = typed.size();
for (int j = 0; j < n; ++j) {
if (i < m && name[i] == typed[j]) ++i;
else if (!j || typed[j] != typed[j - 1]) return false;
}
return i == m;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/925

参考资料:

https://leetcode.com/problems/long-pressed-name/

https://leetcode.com/problems/long-pressed-name/discuss/183994/C%2B%2BJavaPython-Two-Pointers

https://leetcode.com/problems/long-pressed-name/discuss/183929/C%2B%2B-2-lines-accepted-and-5-lines-accurate

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

[LeetCode] 925. Long Pressed Name 长按键入的名字的更多相关文章

  1. Leetcode925.Long Pressed Name长按键入

    你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的名字(其中一 ...

  2. leetcode 925. Long Pressed Name

    判定是否长按 var isLongPressedName = function (name, typed) { var i = 1, j = 0, n = name.length, m = typed ...

  3. 【Leetcode_easy】925. Long Pressed Name

    problem 925. Long Pressed Name solution1: class Solution { public: bool isLongPressedName(string nam ...

  4. 【python】Leetcode每日一题-最长公共子序列

    [python]Leetcode每日一题-最长公共子序列 [题目描述] 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . ...

  5. leetcode 925. 长按键入

    题目描述: 你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的 ...

  6. [Swift]LeetCode925. 长按键入 | Long Pressed Name

    Your friend is typing his name into a keyboard.  Sometimes, when typing a character c, the key might ...

  7. 力扣(LeetCode)长按键入 个人题解

    你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的名字(其中一 ...

  8. 【LeetCode】925. Long Pressed Name 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 参考资料 日期 题目地址:https://leetc ...

  9. [LeetCode&Python] Problem 925. Long Pressed Name

    Your friend is typing his name into a keyboard.  Sometimes, when typing a character c, the key might ...

随机推荐

  1. Leetcode练习题Remove Element

    Leetcode练习题Remove Element Question: Given an array nums and a value val, remove all instances of tha ...

  2. TiDB 压力测试报告

    (转载自公众号DBATech) 一.测试环境 1.tidb 集群架构: 测试使用最基本的TiDB架构.即 3个tidb-server节点+ 3个tikv节点 + 3个pd节点. 2.tidb集群的部署 ...

  3. Date以及LocalDateTime格式化

    public static void main(String[] args) { LocalDateTime local = LocalDateTime.now(); Date date = new ...

  4. centos ftp服务器搭建 vsftpd 匿名访问配置方法 ftp 550 Failed to open file 错误处理

    vsftpd是linux下常用的ftp服务软件,配置起来其实不复杂,只是网上很多文章,配置后都无法成功.我使用它是用于局域网内部分享文件的,所以使用匿名的方式. ftp本身密码是明文传输的,如果需要安 ...

  5. powershell与linux bash对比

    转自Github/Powershell Bash PowerShell Description ls dir, Get-ChildItem List files and folders tree di ...

  6. WPF通过不透明蒙板切割显示子控件

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Backspace110/article/ ...

  7. 记录微信支付开发中的小经验(errcode = 40163; errmsg = "code been used")

    今天上午客户提出问题,看了一下报错截图,应该是我更新版本时少传了一个参数,导致后续报错, 心里想着小问题,直接生产环境添加一下就行了,于是就为了我这一上午的悲剧埋下了伏笔 十分自信的把页面中的代码添加 ...

  8. Java生鲜电商平台-物流动态费率、免运费和固定运费设计与架构

    Java生鲜电商平台-物流动态费率.免运费和固定运费设计与架构 说明:物流配送环节常见的有包邮,免运费,或者偏远地区动态费率,还存在一些特殊的情况,固定费率,那么如何进行物流的架构与设计呢? 运费之困 ...

  9. php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断

    php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断 实际需求:把sphinx返回的结果放到ssdb缓存里,要考虑到sph ...

  10. bat脚本输出日志

    一,bat脚本常用的的输出命令是“echo 输出内容”,可以利用echo将文本输出到cmd窗口或文件.bat脚本是不区分大小写的脚本语言,因此大小写都可以. 例如: REM 在命令行窗口输出 echo ...