1 条题解
-
0
📝 题目大意
判断一个仅由
A、B、C组成的字符串是否为"扩展 ABC 字符串",即能否表示为若干A+ 若干B+ 若干C按顺序拼接的形式(每部分可以为空)。换句话说,判断字符串是否匹配正则A*B*C*。💡 解题思路
-
题目分析:,数据范围极小,可以直接模拟。核心约束是:字符串中所有
A必须出现在B之前,所有B必须出现在C之前。一旦出现字符顺序"回退"(如B后面出现A,或C后面出现A/B),答案即为No。 -
算法推导:使用状态机思想,维护一个
state变量表示当前所处的阶段:state = 0:初始状态,尚未读入任何字符。state = 1:已进入 A 阶段(见过A,未见过B或C)。state = 2:已进入 B 阶段(见过B,未见过C)。state = 3:已进入 C 阶段(见过C)。
遍历字符串中的每个字符
c:- 若
c == 'A':如果state > 1(说明已经出现过B或C),则A出现在不允许的位置,标记非法并退出;否则将state置为1。 - 若
c == 'B':如果state > 2(说明已经出现过C),则B出现在不允许的位置,标记非法并退出;否则将state置为2(从0或1过渡到 B 阶段)。 - 若
c == 'C':将state置为3(C永远不会导致非法,因为它是最后一个阶段)。
-
边界与细节:
- 空字符串合法(题目明确说明),但本题 ,无需处理。
- 全
A、全B、全C均合法(对应另外两个部分为空串的情况)。 - 字符串
AB、BC、ABC等合法;BA、CB、CA、ACB等非法。 - 注意
state初始值为0,当读到A时state变为1,读到B时state变为2——即使之前没有A(即state从0直接跳到2),这对应 为空串的情况,是合法的。
⏱️ 复杂度分析
- 时间复杂度:,只需遍历字符串一次。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (C++)
#include <iostream> #include <string> using namespace std; int main() { string S; cin >> S; int state = 0; // 状态机:0=初始, 1=A阶段, 2=B阶段, 3=C阶段 bool ok = true; for (char c : S) { if (c == 'A') { if (state > 1) { // 已出现过 B 或 C,A 不能再出现 ok = false; break; } state = 1; // 进入 A 阶段 } else if (c == 'B') { if (state > 2) { // 已出现过 C,B 不能再出现 ok = false; break; } if (state < 2) state = 2; // 进入 B 阶段(允许从 A 阶段或初始状态进入) } else if (c == 'C') { if (state < 3) state = 3; // 进入 C 阶段(C 不会导致非法) } } cout << (ok ? "Yes" : "No") << endl; return 0; } -
- 1
信息
- ID
- 764
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者