POJ3704:扩号匹配问题(递归)
3704:扩号匹配问题
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
- 输入
- 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
注意:cin.getline(str,100)最多只能输入99个字符! - 输出
- 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
- 样例输入
-
((ABCD(x) )(rttyy())sss)(
- 样例输出
-
((ABCD(x) $$ )(rttyy())sss)( ? ?$
题目可以用递归法进行解决,但是思考了一下,发现还是用二重遍历来的方便。1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() { 4 string s; 5 while(cin>>s) { 6 cout<<s<<endl; 7 int len=s.length(); 8 for(int i=0; i<len; i++) { 9 for(int j=i-1; j>=0; j--) { 10 if(s[i]==')'&&s[j]=='(') { 11 s[i]=s[j]=' '; 12 } 13 } 14 } 15 for(int i=0; i<len; i++) { 16 if(s[i]==')')cout<<"?"; 17 else if(s[i]=='(')cout<<"$"; 18 else cout<<" "; 19 } 20 cout<<endl; 21 } 22 return 0; 23 }
下面是递归方法,递归的过程讨论的情况较多
#include<bits/stdc++.h> using namespace std; string s; stack<int> sta; int len; int a[105]; void DFS(int i) { if(i == len) return ; if(a[i] == 1) { sta.push(i); s[i] = '$'; DFS(i + 1); } else if(a[i] == 2) { if( sta.empty() ) { sta.push(i); s[i] = '?'; DFS(i + 1); } else { int b = sta.top(); if( a[b] == 1 ) { sta.pop(); s[b] = ' '; s[i] = ' '; DFS(i + 1); } else { sta.push(i); s[i] = '?'; DFS(i + 1); } } } else { s[i] = ' '; DFS(i + 1); } } int main () { while(cin >> s) { len = s.length(); for(int i = 0; i < len; i++) { if(s[i] == '(') a[i] = 1; else if(s[i] == ')') a[i] = 2; else a[i] = 0; } while(!sta.empty()) sta.pop(); cout << s << endl; DFS(0); cout << s << endl; } }
越努力越幸运