英文原文
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
andtyped
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 解释:长按名字中的字符并不是必要的。
提示:
name.length <= 1000
typed.length <= 1000
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}$ 的每个字符都被「匹配」了。
代码
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();
}
};
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();
}
}
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;
}
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;
};
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% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|