10.21 打卡
LeetCode每日一题 925.长键输入
解题思路:
利用双指针,指针i
和j
,指针i
扫描name,指针j
扫描typed。
当 name[i] == typed[j] 的时候,并且指针i小于name的长度,此时指针 i 和 j 都向右移动即 i++,j++
当 name[i] != type[j] 的时候,此时有三种情况:
(1) 当 name[i-1] 存在(即 j > 0) 并且 typed[j] == typed[j-1] , 这种情况就是题目所说的按键被长按的情况,即输入的字符被输入多次,所 以此时只移动指针j,指针i不移动,继续下一次循环判断;
(2) 当 name[i-1] 不存在(即比较的第一个字符就不相同)时 ,证明一开始就输入错误,此时return false;或者 当name[i-1] 存在但是 type[j] != typed[j-1]时,此时说明输入的字符即不是它名字中的字符也不是因为长按而输进去的,所以也 return false。
下面直接贴出代码
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都向前进
i++;
j++;
} else if (j > 0 && typed.charAt(j) == typed.charAt(j-1)) { // 出现长按,i不动,j++
j++;
}else
return false; // 即不是长按也不相等,此时指针j还没走完整个typed,所以证明输错了
}
return i == name.length();
// 指针j扫描完typed后,如果指针i和name的长度相等,即证明指针i也扫描完name,
// 并且每一个字符都和typed匹配(包括长按)此时name就可能是“你朋友的名字”
}
}
GO
func isLongPressedName(name string, typed string) bool {
i := 0
j := 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)