LeetCode 925. 长按键入
题目描述
思路分析
解法一:双指针(推荐)
核心思路:
- 用两个指针
i和j分别扫描name和typed- 若当前字符相同,则两指针同时前进
- 若当前字符不同,则检查
typed[j]是否与typed[j-1]相同(即长按重复字符),是则j前进跳过重复字符- 遍历结束后,
typed剩余字符必须都是最后匹配字符的重复,name必须已全部匹配完
复杂度分析:
- 时间复杂度:O(m + n),其中 m 为 name 长度,n 为 typed 长度
- 空间复杂度:O(1),只使用常数额外空间
class Solution {
public boolean isLongPressedName(String name, String typed) {
int i = 0;
int 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)) {
// typed[j] 是长按重复字符,跳过
j++;
} else {
// 无法匹配
return false;
}
}
// name 必须已全部匹配完
return i == name.length();
}
}
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] {
// typed[j] 是长按重复字符,跳过
j++
} else {
// 无法匹配
return false
}
}
// name 必须已全部匹配完
return i == len(name)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 392. 判断子序列 | 简单 | 双指针、字符串 |
| 844. 比较含退格的字符串 | 简单 | 双指针、字符串 |
| 986. 区间列表的交集 | 中等 | 双指针、数组 |
| 1768. 交替合并字符串 | 简单 | 双指针、字符串 |
| 977. 有序数组的平方 | 简单 | 双指针、数组 |
| 88. 合并两个有序数组 | 简单 | 双指针、数组 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!