P1241洛谷括号序列

做题思路变化:

第一眼还以为是和力扣差不多的括号序列题....(莫名兴奋,遇见做过的题就会兴奋到抽搐~~)

于是乎,题目都没读完全,立马开始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;
}

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值