AT2586 题解

题目传送门

许多人使用栈,然而根本不需要。

先读入整个字符串,然后枚举每个字符。

如果当前字符是左括号,往后搜,有就匹配并消除。

然而消除这个动作太慢了,如果匹配到,只需把它标记为无用字符即可。

如果没有匹配到,表明右括号少了,对应计数器标记

是右括号就往前搜,其余同理。

最后根据计数器补充输出。

满分代码:

#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int main()
{
	int len;
	string s;
	scanf("%d", &len);
	cin >> s; 
	string t = s; //操作时会改变原序列,因此要备份一下。 
	int cntL = 0, cntR = 0; //记录匹配完后还剩几个左右括号。 
	
	for (int i = 0; i < len; i++)
	{
		if (s[i] == '(') //往后搜。 
		{
			bool Is_find = true;
			for (int j = i+1; j < len; j++)
				if (s[j] == ')')  //匹配到了。 
				{
					Is_find = false;
					s[i] = s[j] = 'x';
					break;
				}
			if (Is_find) cntR++;   //匹配不到。 
		}
		else if (s[i] == ')') //往前搜。 
		{
			bool Is_find = true;
			for (int j = i-1; j >= 0; j--)
				if (s[j] == '(')
				{
					Is_find = false;
					s[i] = s[j] = 'x';
					break;
				}
			if (Is_find) cntL++;
		}
	}
	for (int i = 1; i <= cntL; i++) printf("(");
	cout << t;
	for (int i = 1; i <= cntR; i++) printf(")");
	printf("\n");  //别忘了换行。 
	return 0;
}

首发:2022-01-28 14:32:21

posted @ 2022-08-24 23:58  liangbowen  阅读(16)  评论(0编辑  收藏  举报