加载中...
925-长按键入(Long Pressed Name)
发表于:2021-12-03 | 分类: 简单
字数统计: 1.2k | 阅读时长: 5分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/long-pressed-name

英文原文

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.

 

Constraints:

  • 1 <= name.length <= 1000
  • 1 <= typed.length <= 1000
  • name and typed contain only lowercase English letters.

中文题目

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

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

 

示例 1:

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

示例 2:

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

示例 3:

输入:name = "leelee", typed = "lleeelee"
输出:true

示例 4:

输入:name = "laiden", typed = "laiden"
输出:true
解释:长按名字中的字符并不是必要的。

 

提示:

  1. name.length <= 1000
  2. typed.length <= 1000
  3. name 和 typed 的字符都是小写字母。

 

 

通过代码

高赞题解

方法一:双指针

思路与算法

根据题意能够分析得到:字符串 $\textit{typed}$ 的每个字符,有且只有两种「用途」:

  • 作为 $\textit{name}$ 的一部分。此时会「匹配」$\textit{name}$ 中的一个字符

  • 作为长按键入的一部分。此时它应当与前一个字符相同。

如果 $\textit{typed}$ 中存在一个字符,它两个条件均不满足,则应当直接返回 $\textit{false}$;否则,当 $\textit{typed}$ 扫描完毕后,我们再检查 $\textit{name}$ 的每个字符是否都被「匹配」了。

实现上,我们使用两个下标 $i,j$ 追踪 $\textit{name}$ 和 $\textit{typed}$ 的位置。

  • 当 $\textit{name}[i]=\textit{typed}[j]$ 时,说明两个字符串存在一对匹配的字符,此时将 $i,j$ 都加 $1$。

  • 否则,如果 $\textit{typed}[j]=\textit{typed}[j-1]$,说明存在一次长按键入,此时只将 $j$ 加 $1$。

最后,如果 $i=\textit{name}.\text{length}$,说明 $\textit{name}$ 的每个字符都被「匹配」了。

代码

[sol1-C++]
class Solution { public: bool isLongPressedName(string name, string typed) { int i = 0, j = 0; while (j < typed.length()) { if (i < name.length() && name[i] == typed[j]) { i++; j++; } else if (j > 0 && typed[j] == typed[j - 1]) { j++; } else { return false; } } return i == name.length(); } };
[sol1-Java]
class Solution { public boolean isLongPressedName(String name, String typed) { int i = 0, j = 0; while (j < typed.length()) { if (i < name.length() && name.charAt(i) == typed.charAt(j)) { i++; j++; } else if (j > 0 && typed.charAt(j) == typed.charAt(j - 1)) { j++; } else { return false; } } return i == name.length(); } }
[sol1-C]
bool isLongPressedName(char* name, char* typed) { int n = strlen(name), m = strlen(typed); int i = 0, j = 0; while (j < m) { if (i < n && name[i] == typed[j]) { i++; j++; } else if (j > 0 && typed[j] == typed[j - 1]) { j++; } else { return false; } } return i == n; }
[sol1-JavaScript]
var isLongPressedName = function(name, typed) { const n = name.length, m = typed.length; let i = 0, j = 0; while (j < m) { if (i < n && name[i] === typed[j]) { i++; j++; } else if (j > 0 && typed[j] === typed[j - 1]) { j++; } else { return false; } } return i === n; };
[sol1-Golang]
func isLongPressedName(name string, typed string) bool { i, j := 0, 0 for j < len(typed) { if i < len(name) && name[i] == typed[j] { i++ j++ } else if j > 0 && typed[j] == typed[j-1] { j++ } else { return false } } return i == len(name) }

复杂度分析

  • 时间复杂度:$O(N+M)$,其中 $M,N$ 分别为两个字符串的长度。

  • 空间复杂度:$O(1)$。

统计信息

通过次数 提交次数 AC比率
51444 132818 38.7%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
926-将字符串翻转到单调递增(Flip String to Monotone Increasing)
下一篇:
927-三等分(Three Equal Parts)
本文目录
本文目录