LeetCode 3121.统计特殊字母的数量 II:状态机

【LetMeFly】3121.统计特殊字母的数量 II:状态机

力扣题目链接:https://leetcode.cn/problems/count-the-number-of-special-characters-ii/

给你一个字符串 word。如果 word 中同时出现某个字母 c 的小写形式和大写形式,并且每个 小写形式的 c 都出现在第一个大写形式的 c 之前,则称字母 c 是一个 特殊字母

返回 word特殊字母 的数量。

示例 1:
输入: word = "aaAbcBC"

输出: 3

解释:

特殊字母是 'a''b''c'

示例 2:
输入: word = "abc"

输出: 0

解释:

word 中不存在特殊字母。

示例 3:
输入: word = "AbBCab"

输出: 0

解释:

word 中不存在特殊字母。

提示:

  • 1 <= word.length <= 2 * 105
  • word 仅由小写和大写英文字母组成。

解题方法:状态机

对于每种字母而言,一共有几种状态?

状态 标记
初始状态 NONE
只遇到了小写字母 SMALL
遇到过小写字母且在此之后只遇到了大写字母 OK
此字母状态不合法 CANNOT

遍历字符串,对于第 i i i个字母:

  • 如果其状态是NONE:

    • 如果这个字母是小写,则转为SMALL
    • 否则不合法,转为CANNOT
  • 如果其状态是SMALL:

    • 如果这个字母是大写,则这个字母到目前为止满足条件,转为OK,答案数量加一
  • 如果其状态是OK:

    • 如果这个字母是小写,则大写后出现小写不合法,转为CANNOT,答案数量减一
  • 否则(状态已经是CANNOT),不用管了,反正这个字母没希望了

以上。

  • 时间复杂度 O ( l e n ( w o r d ) ) O(len(word)) O(len(word))
  • 空间复杂度 O ( C ) O(C) O(C),其中 C = 26 C=26 C=26

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-05-27 22:33:20
 */
enum State {
    NONE,
    SMALL,
    OK,
    CANNOT,
};

class Solution {
public:
    int numberOfSpecialChars(string word) {
        State state[26];
        int ans = 0;
        for (char c : word) {
            bool small = 'a' <= c && c <= 'z';
            int idx = small ? c - 'a' : c - 'A';
            switch (state[idx]) {
            case NONE:
                state[idx] = small ? SMALL : CANNOT;
                break;
            case SMALL:
                if (!small) {
                    state[idx] = OK;
                    ans++;
                }
                break;
            case OK:
                if (small) {
                    state[idx] = CANNOT;
                    ans--;
                }
                break;
            }
        }
        return ans;
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
小糯米60110 小时前
JS 数组
数据结构·算法·排序算法
拳里剑气10 小时前
C++算法:链表
c++·算法·链表
凌波粒10 小时前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode
旖-旎10 小时前
《LeetCode 417 太平洋大西洋水流问题 FloodFill DFS 解法》
c++·算法·深度优先·力扣·floodfill
凌波粒10 小时前
LeetCode--46.全排列(回溯算法)
数据结构·算法·leetcode
2zcode10 小时前
项目文档:基于MATLAB语音信号变声算法设计与实现
算法·matlab·语音识别
指令集梦境10 小时前
图解:单调栈算法模板(Java语言)
java·开发语言·算法
生成论实验室11 小时前
自动驾驶:一个自主运动的系统
人工智能·算法·机器学习·语言模型·机器人·自动驾驶·安全架构
sheeta199811 小时前
LeetCode 每日一题笔记 日期:2026.06.16 题目:3612. 字符串特殊符号处理
笔记·算法·leetcode
keykey6.11 小时前
决策树:可解释的 if-else 规则
算法·决策树·机器学习