LeetCode 925. 长按键入

题目描述

925. 长按键入

思路分析

解法一:双指针(推荐)

核心思路

  • 用两个指针 ij 分别扫描 nametyped
  • 若当前字符相同,则两指针同时前进
  • 若当前字符不同,则检查 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. 合并两个有序数组 简单 双指针、数组
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/81424688
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!