AtCoder Beginner Contest 454 D 题解

题目大意

给定操作规则:字符串中的子串 (xx) 可以转化为 xx。问字符串 \(A\) 是否能通过该规则转化成 \(B\)

题目分析

核心思路

注意到题目中提到的是“子串”转化。观察规则可以发现:

  • (xx) 能变成 xx
  • 对于更复杂的嵌套,如 (xxx),由于其不包含完整的 (xx) 结构,只能先通过内部转化(如果有的话)再处理。

我们的主要思路是将 \(A\) 串与 \(B\) 串分别进行“规范化”处理(即不断执行转化直到无法操作为止),最后判断处理后的两个字符串是否完全一致。

算法优化

若采用暴力循环寻找 (xx) 并替换,在面对类似 ((((((...xx...)))))) 的数据时,复杂度会退化至 \(O(n^2)\)

为了提高效率,我们可以使用栈(Stack)的思想进行线性处理:

  1. 遍历字符串,将字符逐个压入栈中。
  2. 每当栈顶的四个字符恰好组成 (xx) 时,立即弹出这四个字符,并将 xx 压回栈中。
  3. 遍历结束后,栈内的内容即为规范化后的字符串。

该算法的时间复杂度为 \(O(n)\),其中 \(n\) 为字符串长度。

代码实现

可以使用 std::string 模拟栈的操作:

string res;
for (char c : s)
{
    res.push_back(c);
    if (res.size() >= 4)
    {
        int n = res.size();
        if (res[n - 4] == '(' && res[n - 3] == 'x' &&
            res[n - 2] == 'x' && res[n - 1] == ')')
        {
            res.pop_back(); // ')'
            res.pop_back(); // 'x'
            res.pop_back(); // 'x'
            res.pop_back(); // '('
            res.push_back('x');
            res.push_back('x');
        }
    }
}
return res;
posted @ 2026-04-19 10:24  Axor  阅读(27)  评论(0)    收藏  举报