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

千篇源码题解已开源

相关推荐
致Great3 小时前
DeepSeek Harness插件开发实战教程:我让它自己写了一个 arXiv 搜索插件
算法
罗西的思考8 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机8 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil2089 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返10 小时前
算法系列2:滑动窗口
算法
Herbert_hwt10 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
ZC跨境爬虫11 小时前
LeetCode 108. 将有序数组转换为二叉搜索树(递归构建详解 + Java Python 实现)
java·python·leetcode
Tisfy12 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-12 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。12 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论