dp
dp[i][j]表示串从i到j需要添加的括号数,显然,如果字符串长度为一,dp[i][i]=1;当大于一的时候:
如果str[i]与str[j]匹配,则dp[i][j]=dp[i+1][j-1];否则dp[i][j]=min(dp[i][k]+dp[k+1][j]) (i<=k<j)
用path[i][j]记录k的位置,递归输出括号。
具体见代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAX 111
using namespace std;
char ch[MAX];
int dp[MAX][MAX],path[MAX][MAX];
void out(int l,int r)
{
if(l>r)
return ;
if(l==r)
{
if(ch[l]=='('||ch[l]==')')
printf("()");
else printf("[]");
}
else if(path[l][r]==-1)
{
printf("%c",ch[l]);
out(l+1,r-1);
printf("%c",ch[r]);
}
else
{
out(l,path[l][r]);
out(path[l][r]+1,r);
}
}
int main()
{
int i,j;
int len,temp;
cin>>ch;
len=strlen(ch);
for(i=0;i<MAX;i++)
dp[i][i]=1;
int t;
for(t=1;t<len;t++) //枚举子串的长度,由1至len;
{
for(i=0;i<len-t;i++) //i为串的首指针,j为尾指针;
{
j=i+t;
dp[i][j]=111111111;
if(ch[i]=='('&&ch[j]==')'||ch[i]=='['&&ch[j]==']')
{
dp[i][j]=dp[i+1][j-1];
path[i][j]=-1;
}
for(int k=i;k<j;k++)
{
if(dp[i][j]>dp[i][k]+dp[k+1][j])
{
dp[i][j]=dp[i][k]+dp[k+1][j];
path[i][j]=k;
}
}
}
}
out(0,len-1);
cout<<endl;
return 0;
}