LeetCode 每日一题笔记 日期:2026.05.27 题目:3121. 统计特殊字母的数量 II

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.05.27
  • 题目:3121. 统计特殊字母的数量 II
  • 难度:中等
  • 标签:字符串、数组、哈希

1. 题目理解

问题描述

给你一个字符串 word

如果某个小写字母在字符串中所有出现的位置都在对应大写字母出现之前 ,那么这个字母就是特殊字母

返回字符串中特殊字母的数量。

示例

输入:word = "AbBCab"

输出:1

2. 解题思路

核心观察

  • 小写字母必须全部出现在大写字母第一次出现之前
  • 记录每个字符第一次出现最后一次出现的位置。
  • 判断:小写字母最后一次出现的位置 < 大写字母第一次出现的位置。

算法步骤

  1. 遍历字符串,记录每个字符的首次和末次出现位置。
  2. 遍历 26 个字母,检查是否满足条件。
  3. 统计满足条件的字母数量。

3. 代码实现

java 复制代码
public class Solution {
    public int numberOfSpecialChars(String word) {
        int[][] arr = new int[26][2];

        int res = 0;
        for (int i = 0; i < word.length(); i++) {
            char cur = word.charAt(i);
            //处理小写
            if (cur <= 'z' && cur >= 'a') {
                int num = cur - 'a';
                if (arr[num][1] != 0) {
                    arr[num][0] = 0;
                } else arr[num][0] = 1;
            }
            //处理大写
            if (cur <= 'Z' && cur >= 'A') {
                int num = cur - 'A';
                arr[num][1] = 1;

                
            }
        }
        for (int i = 0; i < 26; i++) {
            if (arr[i][0] == 1 && arr[i][1] == 1) {
                res++;
            }
        }

        return res;
    }
}

4. 代码优化说明

java 复制代码
class Solution {
public int numberOfSpecialChars(String word) {
// 记录每个字符第一次出现的位置
int[] first = new int['z' + 1];
// 记录每个字符最后一次出现的位置
int[] last = new int['z' + 1];

// 遍历字符串,填充 first 和 last 数组
for (int i = 1; i <= word.length(); ++i) {
    int j = word.charAt(i - 1);
    if (first[j] == 0) {
        first[j] = i;
    }
    last[j] = i;
}

int ans = 0;
// 遍历 26 个字母
for (int i = 0; i < 26; ++i) {
    // 小写字母
    int a = 'a' + i;
    // 大写字母
    int b = 'A' + i;
    // 判断:小写字母存在 && 小写最后一次 < 大写第一次
    if (last[a] > 0 && last[a] < first[b]) {
        ++ans;
    }
}
return ans;
}
}

5. 复杂度分析

  • 时间复杂度 :O(n+26)O(n + 26)O(n+26)
    一次遍历字符串 + 遍历26个字母。
  • 空间复杂度 :O(1)O(1)O(1)
    固定大小的数组,常数空间。

6. 总结

  • 核心:记录字符首次/末次位置,判断位置关系。
  • 优化思路:用位置判断替代复杂的状态标记,逻辑更清晰。
  • 关键:小写全部在大写前面 → last[小写] < first[大写]
相关推荐
JieE21214 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
怕浪猫2 天前
Electron 系列文章封面图
算法·架构·前端框架