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