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[大写]
相关推荐
Amazing_Cacao16 分钟前
CFCA精品可可工艺师初级校准:暴力破解机器黑盒,实现物理参数与最终风味的精准对齐
笔记·学习
阿米亚波19 分钟前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发
alphaTao1 小时前
LeetCode 每日一题 2026/7/6-2026/7/12
算法·leetcode
想吃火锅10051 小时前
【leetcode】56.合并区间js
算法·leetcode·职场和发展
imuliuliang1 小时前
可合并堆在多任务调度中的优势与实现技巧7
算法
学究天人1 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷6)
网络·算法·数学建模·动态规划·几何学·图论·拓扑学
wabs6661 小时前
关于动态规划【力扣72.编辑距离的思考】
算法·leetcode·动态规划
用户333239768841 小时前
我做了一个 RepoMind:让 AI 写架构前,先去看看真实开源项目
算法
chh5632 小时前
C++--list
开发语言·数据结构·c++·学习·算法·list
killerbasd2 小时前
总结 7。10
人工智能·算法·机器学习