做题思路变化:
第一眼还以为是和力扣差不多的括号序列题....(莫名兴奋,遇见做过的题就会兴奋到抽搐~~)
于是乎,题目都没读完全,立马开始code!
不出意外,wa了,10分....
我擦.....
不对啊,再读一遍题目~~
哦,原来是需要输出结果的,稍微修改一下就可以了把..
改完,20....
沃特发(故事背景是午夜11点),不做了,去求,睡觉~~
深夜哭泣,现在一道橙题都可以卡着我如此难受了吗... 明天我一定要早起,必须拿捏这道题!
但我今早上一醒来就是10.30了,随便吃个早饭继续code(喂,你不是要早起的吗~~)
继续苦思冥想 = 打开讨论区找大佬思路
果不其然,还是让我找到了题意的核心要点,好了,接下来才是本题的关键所在
最开始我是想着用栈,匹配的就出去,不匹配的放里面,可这有个缺陷,就是在我收集答案的时候,我这样就拿不到匹配的(),因为它已经出了栈,在这个点是没有这个括号的
所以,这个栈里面放的其实是下标
如果栈为空或者当前字符是左括号,无需判断,直接放入
注意,下面是关键
当前字符是右括号 栈为空,这是可以放入的
栈不为空,就判断,如果当前字符和栈顶元素匹配了,那么栈顶元素出栈
如果不匹配,注意,那么当前字符所对应的valid数组设置为1(当前元素不匹配)
这样,最后,栈里面存放的就都是不匹配的括号,依次将valid数组设置为1
最后再遍历valid数组,如果当前不匹配,直接补全,如果匹配,那就单加字符
以下是AC代码
#include<bits/stdc++.h>
using namespace std;
int valid[105];
int main() {
//还得考虑配对是否成功
stack<int>stk;//里面放下标 最终留在stack里面的都是配对不成功的
string s;
cin >> s;
for (int i = 0; i < s.size(); ++i) {
//事实上,只有左括号才放进去,右括号判断放不进去就直接valid[i] = 1
if (stk.empty() || s[i] == '(' || s[i] == '[') stk.push(i);
else {
if (s[stk.top()] == '(' && s[i] == ')' || s[stk.top()] == '[' && s[i] == ']') stk.pop();
else valid[i] = 1;
}
}
// 0是合格1是不合格
while (!stk.empty()) {
valid[stk.top()] = 1;
stk.pop();
}
string res = "";
for (int i = 0; i < s.size(); ++i) {
if (valid[i]) {
if (s[i] == '(' || s[i] == ')') res += "()";
else res += "[]";
}
else res += s[i];
}
cout << res << endl;
return 0;
}