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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
专注仿真1 天前
ACM算法
算法·深度优先
顺顺 尼1 天前
linux 进程信号(上)
linux·c++·算法
罗西的思考1 天前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(5)--- GRPO
人工智能·算法·机器学习
richard_yuu1 天前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
mmmmath_31 天前
LeetCode.225.用队列实现栈
算法
Elaine3361 天前
数据结构与算法-程序
数据结构·python·算法·计算机基础·编程基础
2601_965742221 天前
布局GEO AI本地营销,我重点看这几个细节
大数据·人工智能·算法·ai·新媒体运营
EatFan1 天前
AI Agent 上生产前先加三道闸门:审批、限权、可回放的工程实践
人工智能·python·算法·多智能体·ai agent·mcp·harness
思茂信息1 天前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
Persistent的粽子!1 天前
双指针算法:最大盛水容器
c++·算法·leetcode