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[大写]
相关推荐
aaaameliaaa1 小时前
字符函数和字符串函数
c语言·笔记·算法
城管不管2 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
月疯2 小时前
二分法算法(水平等分图形面积)
算法
tq10862 小时前
开放与封闭:类型系统的安全哲学
笔记
豆瓣鸡3 小时前
算法日记 - Day3
java·开发语言·算法
白白白小纯3 小时前
算法篇—反转链表
c语言·数据结构·算法·leetcode
Achou.Wang3 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
龙仔7253 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
韭菜炒鸡肝天3 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
The Chosen One9853 小时前
高进度算法模板速记(待完善)
java·前端·算法