TopCoderに出てきそうな問題。普通に解くだけの問題だけれども、もう少し美しいコードにできそうだ。
ただ、"([)]."は本来noと答えならなければならないが、yesと答えるものと勘違いしていて、時間をかけてしまった。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int ascii[128]; char str[200]; int l, r; bool check(int current, int &p) { int c; bool f = true; while (c = str[p], c && f) { switch (c) { case '(': case '[': l++; f &= check(c, ++p); break; case ')': case ']': r++; return current == ascii[c]; } p++; } return f; } int main() { ascii[')'] = '('; ascii[']'] = '['; for (;;) { scanf("%[^\n]%*c", str); if (str[0] == '.') break; l = r = 0; int pos = 0; bool f = (check(-1, pos) && l == r); cout << (f?"yes":"no") << endl; } return 0; }
0 件のコメント:
コメントを投稿