题目描述
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。
你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。
name.length <= 1000
typed.length <= 1000
name 和 typed 的字符都是小写字母。
样例
输入:name = "laiden", typed = "laiden"
输出:true
解释:长按名字中的字符并不是必要的。
输入:name = "leelee", typed = "lleeelee"
输出:true
输入:name = "saeed", typed = "ssaaedd"
输出:false
解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样
双指针 $O(n)$
这个题又是双指针的题目,我们一定要深刻的理解题意。从题意中得出的结论,会影响我们指针的移动指向。
这里我们是按照顺序从前往后来比较。
1.当前两指针 所指向的值不等 j == 0,直接false
1.当前两指针 所指向的值不等,j > 0 ,我们就要往后移动指针,直到不等的时候。
2.当前两指针,所指向的值相等 ,i ,j ;
在比较的过程中,结束循环条件,可能有剩余的元素,没有比较。可能是 name或者typed
那么 name的话,直接 false;
那么 typed的话,有不同就false;
C++ 代码
class Solution {
public:
bool isLongPressedName(string name, string typed) {
int n = name.size();
int m = typed.size();
int i = 0,j = 0;
while(i < n && j < m){
if (name[i] == typed[j]) i ++,j ++;//相同就往右移动
else{
if (!j) return false; //第一个不相同得时候,就 false
while(j < m && typed[j] == typed[j-1]) j ++;// 当
if (name[i] == typed[j]){ //判断 相不相等
i ++,j ++;
}
else return false;
}
}
if (i < n) return false; // 多出的 判断
while(j < m){
if (typed[j] == typed[j-1]) j ++;
else return false;
}
return true;
}
};