题目: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;
}