nyoj 2

  题目:http://nyoj.top/problem/2

  被strlen()坑了(自己太菜> <),许久没用它,写的时候:l = strlen(br) - 1;。。。。但纠正以后还是WA了,我觉得自己代码没啥毛病(就当AC了吧。。)。

  2018-07-19 10:44:28 发现自己真sb。。。之前代码确实有个小问题,对于']]','))'会输出yes。。。so。。。因为没有做i的判断,所以加上就正确了:

#include <iostream>
#include <string.h>
using namespace std;
#define M 10001
int main()
{
	char br[M], s[M]; int t, l, i, flag;
	cin >> t;
	while (t--)
	{
		cin >> br;
		l = strlen(br);
		flag = i = 0;
		if (br[l] == '(' || br[l] == '[' || l == 1)
			cout << "No" << endl;
		else {
			while (l > -1)
			{
				switch (br[l])
				{
				case ')': s[i++] = br[l]; break;
				case ']': s[i++] = br[l]; break;

				case '(': switch (s[i - 1])
						{
						case ')': i--; break;
						default: flag = 1; break;
						}
						  break;
				case '[': switch (s[i - 1])
						{
						case ']': i--; break;
						default: flag = 1; break;
						}
						  break;
				}
				if (flag)
					break;
				l--;
			}
			if (flag || i)
				cout << "No" << endl;
			else
				cout << "Yes" << endl;
		}
	}
	return 0;
}

  再考虑考虑是否还能再优化一下空间复杂度。。。

  一段不正确的优化代码:

#include <iostream>
#include <string.h>
using namespace std;
#define M 10001
int main()
{
	char br[M]; int t, l, i, sign, s;
	cin >> t;
	while (t--)
	{
		cin >> br;
		l = i = strlen(br);
		sign = s = 0;
		if (br[l] == '(' || br[l] == '[' || l == 1)
			cout << "No" << endl;
		else {
			while (i > -1)
			{
				switch (br[i])
				{
				case ')': s++; break;
				case ']': s++; break;

				case '(': switch (br[l - s])
						{
						case ')': s--; break;
						default: sign = 1;
						}
						  break;
				case '[': switch (br[l - s])
						{
						case ']': s--; break;
						default: sign = 1;
						}
						  break;
				}
				if (sign)
					break;
				i--;
			}
			if (s || i)
				cout << "No" << endl;
			else
				cout << "Yes" << endl;
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/darkchii/p/9334376.html