LeetCode/925. 长按键入

925. 长按键入

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

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

提示:

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

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题本质就是利用双指针比较两个字符串是否满足要求,但是这里面有很多特殊情况。由于题目说明的情况只是按着某个键不松手,重复输入相同的字符,所以虽然有重复,但是字符序列的顺序是不变的,简单来说就是不能出现name中压根没有的字符。我们创建两个两个指针指向了两个字符串,如果两个字符相等,那么两个指针自增,如果不相等,那么有两种情况,第一种是typed中当前字符和上一个字符相同,这种情况就是题目说明的按着某一个键不松手,这时只需要将指向typed的指针自增即可;第二种情况就是tyeped[j] != typed[j - 1],这种情况就是出现了完全不存在name中的字符,直接返回false即可。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public boolean isLongPressedName(String name, String typed) {
//如果第一个字符都不相等,那么肯定不满足条件
if (name.charAt(0) != typed.charAt(0)) return false;

int i = 0, j = 0;
while (i < name.length() && j < typed.length()) {
//如果两个字符相同,指针自增
if (name.charAt(i) == typed.charAt(j)) {
i++;
j++;
} else {
//如果两个字符不相同有两种情况
//1.出现了name中没有的新字符,直接返回false
if (typed.charAt(j) != typed.charAt(j - 1))
return false;
//2.由于长按造成重复,直接自增跳过即可
j++;
}
}

//这里用来处理name已经遍历完,typed剩下的字符只能是name最后一个字符的重复
//和上述的一样,同样有两种情况,一种是出现新字符,一种是长按重复
while (j < typed.length()) {
if (typed.charAt(j) != typed.charAt(j - 1))
return false;
j++;
}
//这里需要判断一下如果typed比name短的话, i != name.length()直接返回false
return i == name.length();
}
}

Comments