括号匹配

来源:互联网 发布:jenkins linux slave 编辑:程序博客网 时间:2024/05/22 08:28

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3[(])(])([[]()])
样例输出
NoNo

Yes


栈解决

#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>#include <stack>using namespace std;int main(){    int n;    scanf("%d",&n);    char c,t;    c=getchar();    while(n--)    {        stack<char>q;        while((c=getchar())!='\n')        {            if(q.empty())                q.push(c);            else            {                t=q.top();                if(t=='('&&c==')')                    q.pop();                else if(t=='['&&c==']')                    q.pop();                else                    q.push(c);            }        }        if(q.empty())            cout<<"YES"<<endl;        else            cout<<"NO"<<endl;    }    return 0;}



括号匹配(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:6
描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入
4[]([])[]((]([)]
样例输出
0032

定义dp[i][j],代表从i 到j 字符,出现了最多几个匹配(至少要添加的括号个数)

可以推出方程:

dp[i][j]=min(dp[i][j],dp[i][k],dp[k+1][j]));

但是:
中间串可能会出现与刚加入的字符相匹配的情况,所以需要更改一下变成:

dp[i][j]=min(dp[i][j],dp[i][k-1],dp[k+1,j-1));


#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3fchar str[110];int match(int i,int j){    if(str[i]=='('&&str[j]==')')    return 1;    if(str[i]=='['&&str[j]==']')    return 1;    return 0;}int main(){    int n,c;    scanf("%d",&c);    int dp[110][110];    getchar();    while(c--)    {        scanf("%s",str);       //getchar();        n=strlen(str);        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++)        {            dp[i][i]=1;        }        for(int j=1;j<n;j++)        {            for(int i=0;i<j;i++)            {                dp[i][j]=dp[i][j-1]+1;                for(int k=i;k<=j;k++)                {                    if(match(k,j))                    dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j-1]);                }            }        }        cout<<dp[0][n-1]<<endl;    }    return 0;}


摘自:http://blog.csdn.net/svitter/article/details/24877159

0 0
原创粉丝点击