• 括号配对问题


    括号配对问题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. }  


  • 相关阅读:
    装饰者模式
    NGUI研究院之三种方式监听NGUI的事件方法(七)
    unity3d连接数据库
    unity3d 连接MSSql
    Unity3D之游戏架构脚本该如何来写
    WCF 部署问题 小总结 (HTTP 不能注册的解决方法)
    Prototype
    web.config文件之自定义错误节
    asp:DropDownList与asp:DataList的联合使用
    剑指offer --合并链表
  • 原文地址:https://www.cnblogs.com/tham/p/6827141.html
Copyright © 2020-2023  润新知