题意是求括号匹配,添加最少数目的'(',')','[',']'使得输入的字符串中括号匹配。
#include <iostream>
#include <string>
using namespace std;
string s;
int l;
int len[110][110];
string res[110][110];
int main()
{
cin>>s;
l=s.length();
for(int i=0;i<l;i++)
{
len[i][0]=0; res[i][0]="";
len[i][1]=2;
if(s[i]=='(' || s[i]==')')
res[i][1]="()";
else res[i][1]="[]";
}
for(int k=2;k<=l;k++) //k表示字符串的长度
for(int i=0;i+k-1<l;i++)
{
len[i][k]=400;
if(s[i]==']'|| s[i]==')')
{
len[i][k]=len[i+1][k-1]+2;
if(s[i]==']') res[i][k]="[]"+res[i+1][k-1];
else res[i][k]="()"+res[i+1][k-1];
}
else
{
for(int j=i+1;j<=i+k-1;j++)
{
if(s[j]-s[i]==')'-'(' || s[j]-s[i]==']'-'[') //存在某个字符和初始字符匹配
{
if(len[i][k]>2+len[i+1][j-i-1]+len[j+1][k-j-1+i])
{
len[i][k]=2+len[i+1][j-i-1]+len[j+1][k-j-1+i];
res[i][k]=s[i]+res[i+1][j-i-1]+s[j]+res[j+1][k-j-1+i];
}
}
if(len[i][k]>len[i+1][j-i]+2+len[j+1][k-j-1+i]) //添加某个字符和初始字符匹配
{
len[i][k]=len[i+1][j-i]+2+len[j+1][k-j-1+i];
if(s[i]=='(') res[i][k]=s[i]+res[i+1][j-i]+')'+res[j+1][k-j-1+i];
else res[i][k]=s[i]+res[i+1][j-i]+']'+res[j+1][k-j-1+i];
}
}
}
}
cout<<res[0][l]<<endl;
return 0;
}