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

发布时间:2026/5/27 8:54:57

LeetCode 每日一题笔记 日期:2026.05.27 题目:3121. 统计特殊字母的数量 II LeetCode 每日一题笔记0. 前言日期2026.05.27题目3121. 统计特殊字母的数量 II难度中等标签字符串、数组、哈希1. 题目理解问题描述给你一个字符串word。如果某个小写字母在字符串中所有出现的位置都在对应大写字母出现之前那么这个字母就是特殊字母。返回字符串中特殊字母的数量。示例输入word AbBCab输出12. 解题思路核心观察小写字母必须全部出现在大写字母第一次出现之前。记录每个字符第一次出现和最后一次出现的位置。判断小写字母最后一次出现的位置 大写字母第一次出现的位置。算法步骤遍历字符串记录每个字符的首次和末次出现位置。遍历 26 个字母检查是否满足条件。统计满足条件的字母数量。3. 代码实现publicclassSolution{publicintnumberOfSpecialChars(Stringword){int[][]arrnewint[26][2];intres0;for(inti0;iword.length();i){charcurword.charAt(i);//处理小写if(curzcura){intnumcur-a;if(arr[num][1]!0){arr[num][0]0;}elsearr[num][0]1;}//处理大写if(curZcurA){intnumcur-A;arr[num][1]1;}}for(inti0;i26;i){if(arr[i][0]1arr[i][1]1){res;}}returnres;}}4. 代码优化说明classSolution{publicintnumberOfSpecialChars(Stringword){// 记录每个字符第一次出现的位置int[]firstnewint[z1];// 记录每个字符最后一次出现的位置int[]lastnewint[z1];// 遍历字符串填充 first 和 last 数组for(inti1;iword.length();i){intjword.charAt(i-1);if(first[j]0){first[j]i;}last[j]i;}intans0;// 遍历 26 个字母for(inti0;i26;i){// 小写字母intaai;// 大写字母intbAi;// 判断小写字母存在 小写最后一次 大写第一次if(last[a]0last[a]first[b]){ans;}}returnans;}}5. 复杂度分析时间复杂度O(n26)O(n 26)O(n26)一次遍历字符串 遍历26个字母。空间复杂度O(1)O(1)O(1)固定大小的数组常数空间。6. 总结核心记录字符首次/末次位置判断位置关系。优化思路用位置判断替代复杂的状态标记逻辑更清晰。关键小写全部在大写前面 →last[小写] first[大写]。

相关新闻