LeetCode 每日一题笔记
0. 前言
- 日期:2026.05.26
- 题目:3120. 特殊字母的数量
- 难度:简单
- 标签:字符串、计数、数组
1. 题目理解
问题描述 :
给你一个字符串 word。如果一个字母在字符串中同时出现了小写和大写形式 ,那么这个字母就是特殊字母 。
返回字符串中特殊字母的数量。
示例:
输入:
word = "aaAbcBC"输出:
3解释:
a、b、c都同时出现了大小写。
2. 解题思路
核心观察
- 只需要统计每个字母小写是否出现、大写是否出现。
- 两者都出现,就是特殊字母。
算法步骤
- 遍历字符串,标记每个字母的大小写是否出现。
- 遍历26个字母,统计同时出现大小写的字母数量。
3. 代码实现
java
package lc3120;
public class Solution {
public int numberOfSpecialChars(String word) {
int res = 0;
int[][] arr = new int[26][2];
for (int i = 0; i < word.length(); i++) {
int a = word.charAt(i) - 'a';
int A = word.charAt(i) - 'A';
//小的
if (a >= 0) {
arr[a][0] = 1;
}
//大的
else {
arr[A][1] = 1;
}
}
for (int i = 0; i < 26; i++) {
if (arr[i][0] == 1 && arr[i][0] == arr[i][1]) {
res++;
}
}
return res;
}
}
4. 代码优化说明
(代码未做任何修改,仅添加注释讲解)
java
class Solution {
public int numberOfSpecialChars(String word) {
// 长度52:0-25存小写,26-51存大写
int [] sum = new int [52];
// 转为字符数组遍历更快
char [] arr = word.toCharArray();
for(char s:arr){
// 小写字母:存在 0~25
if(s >='a' && s<='z' ){
sum[ s-'a']++;
}
// 大写字母:存在 26~51
else if(s>='A' && s<='Z'){
sum[26+s-'A']++;
}
}
int count=0;
// 遍历26个字母,判断小写位和大写位是否都>0
for(int i =0;i<(sum.length)/2;i++){
if(sum[i] >0 && sum[i+26] > 0 ){
count++;
}
}
return count;
}
}
5. 复杂度分析
- 时间复杂度 :O(n)O(n)O(n)
一次遍历字符串 + 一次遍历26个字母。 - 空间复杂度 :O(1)O(1)O(1)
固定长度52的计数数组,常数空间。
6. 总结
- 核心:单个数组统计大小写出现次数。
- 优化点:减少判断、减少二维数组,逻辑更清晰。
- 关键:小写占前26位,大写占后26位,一一对应检查即可。