括号配对问题

括号配对问题I

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
【分析】简单的数据结构--栈或者其它STL工具
代码:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2. #include <stack>  
  3. #include <string>  
  4. #include <bits/stdc++.h>  
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     //freopen("1.txt","r",stdin);  
  10.     int n;  
  11.     string str;  
  12.     cin>>n;  
  13.     while (n--)  
  14.     {  
  15.         cin>>str;  
  16.         int len=str.length();  
  17.         stack<char> vec;  
  18.         for(int i = 0; i < len; i++)  
  19.         {  
  20.             if(vec.empty()) vec.push(str[i]);  
  21.             else if(vec.top()=='[' && str[i]==']') vec.pop();  
  22.             else if(vec.top()=='(' && str[i]==')') vec.pop();  
  23.             else vec.push(str[i]);  
  24.         }  
  25.         if(vec.empty()) puts("Yes");  
  26.         else puts("No");  
  27.     }  
  28.     return 0;  
  29. }  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*vector 容器的应用*/  
  2. #include<bits/stdc++.h>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     int n;  
  7.     scanf("%d",&n);  
  8.     while(n--){  
  9.         vector<char> vec;  
  10.         string ch;  
  11.         vec.push_back(' ');  
  12.         cin>>ch;  
  13.         for(int i=0; i<ch.length(); i++){  
  14.             vec.push_back(ch[i]); /*vec.back()指代最后一个元素,而vec.end()是访问迭代器 !!*/  
  15.             if(vec.back()-1 == *(vec.end()-2) || vec.back()-2 == (int)*(vec.end()-2)){  
  16.                 vec.pop_back();  
  17.                 vec.pop_back();  
  18.             }  
  19.         }  
  20.         if(vec.size()==1) puts("Yes");  
  21.         else puts("No");  
  22.     }  
  23.     return 0;  
  24. }  
  25.   
  26. /* 
  27. 3 
  28. [(]) 
  29. (]) 
  30. ([[]()]) 
  31. No 
  32. No 
  33. Yes 
  34. */  

括号匹配问题II

时间限制:1000 ms  |  内存限制:65535 KB
难度:6
描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入
4
[]
([])[]
((]
([)]
样例输出
0
0
3
2
【分析】:
动态规划的第一种动机是利用递归的重叠子问题,进行记忆化求解,即先用递归法解决问题,再利用重叠子问题转化为动态规划,此题可以用递归来解决:

设序列最少需要添加DP[i][j]个括号,那么根据不同情况可以用不同的方式来转化子问题

Ø  S形如(S’)或[S’];只需要把S’变成规则的,则S就是规则的了

Ø  S形如(S’:先把S’变成规则的,再在最后加上一个),则S就是规则的。

Ø  S形如[S’或者S’)和上一种情况类似。

Ø  只要序列长度大于1,都可以把S分成两部分:分别变成规则序列,再合并变成规则序列。

【代码】:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2. #include <stack>  
  3. #include <string>  
  4. #include <bits/stdc++.h>  
  5. using namespace std;  
  6. const int maxn = 233;  
  7. const int inf = 0x3f3f3f3f;  
  8.   
  9. int n,m,ret,len;  
  10. int DP[maxn][maxn];  
  11. string str;  
  12.   
  13. int Solve()  
  14. {  
  15.     for(int i=0; i<len; ++i) DP[i][i-1]=0;  
  16.     for(int i=0; i<len; ++i) DP[i][i]=1;  
  17.     for(int p=1; p<len; ++p)  
  18.     {  
  19.         for(int i=0; i<len-p; ++i)  
  20.         {  
  21.             int j=i+p;  
  22.             DP[i][j]=inf;  
  23.             if( (str[i]=='(' && str[j]==')') || (str[i]=='[' && str[j]==']'))  
  24.                 DP[i][j]=min(DP[i][j],DP[i+1][j-1]);  
  25.              /* 
  26.             if( (str[i]=='(') || (str[i]=='[')) 
  27.                 DP[i][j]=min(DP[i][j],DP[i+1][j])+1; 
  28.             if( (str[j]==')') || (str[j]==']')) 
  29.                 DP[i][j]=min(DP[i][j],DP[i][j-1])+1; 
  30.               */  
  31.             for(int k=i; k<=j-1; ++k)  
  32.                 DP[i][j]=min(DP[i][j],DP[i][k]+DP[k+1][j]);  
  33.         }  
  34.     }  
  35. }  
  36. int main()  
  37. {  
  38.     //freopen("1.txt","r",stdin);  
  39.     int n;  
  40.     scanf("%d",&n);  
  41.     while(n--)  
  42.     {  
  43.         cin>>str;  
  44.         len=str.length();  
  45.         Solve();  
  46.         printf("%d ",DP[0][len-1]);  
  47.     }  
  48.     return 0;  
  49. }  


原文地址:https://www.cnblogs.com/tham/p/6827141.html