AtCoder Beginner Contest 454 D 题解
题目大意
给定操作规则:字符串中的子串 (xx) 可以转化为 xx。问字符串 \(A\) 是否能通过该规则转化成 \(B\)。
题目分析
核心思路
注意到题目中提到的是“子串”转化。观察规则可以发现:
(xx)能变成xx。- 对于更复杂的嵌套,如
(xxx),由于其不包含完整的(xx)结构,只能先通过内部转化(如果有的话)再处理。
我们的主要思路是将 \(A\) 串与 \(B\) 串分别进行“规范化”处理(即不断执行转化直到无法操作为止),最后判断处理后的两个字符串是否完全一致。
算法优化
若采用暴力循环寻找 (xx) 并替换,在面对类似 ((((((...xx...)))))) 的数据时,复杂度会退化至 \(O(n^2)\)。
为了提高效率,我们可以使用栈(Stack)的思想进行线性处理:
- 遍历字符串,将字符逐个压入栈中。
- 每当栈顶的四个字符恰好组成
(xx)时,立即弹出这四个字符,并将xx压回栈中。 - 遍历结束后,栈内的内容即为规范化后的字符串。
该算法的时间复杂度为 \(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;

浙公网安备 33010602011771号