题目:
输入包括字符串s(4 ≤ |s| ≤ 50,|s|表示字符串长度),保证s是一个合法的括号匹配序列。
如样例所示: s = "(())()",跟字符串s长度相同的合法括号匹配序列有:
"()(())", "((()))", "()()()", "(()())",其中LCS( "(())()", "()(())" )为4,其他三个都为5,所以输出3.
解法:
1、取出原字符串s中的任意一个字符char,得到剩下的字符串s2,剩下的(n-1)个字符相当于一个公共子序列,
将取出的任意字符char,放到s2的每一个位置上形成的新的字符串,若满足合法括号原则,则成立。
代码:
#include<bits/stdc++.h>
using namespace std;
bool is_valid(string str,int n)
{
int cnt =0;
for(int i =0;i<n;i++)
{
if(str[i]=='(')
cnt++;
else
cnt--;
if(cnt<0)
return false;
}
return true;
}
int main()
{
string str;
cin>>str;
set<string> ans;
int n = str.length();
for(int i =0;i<n;i++)
{
string s1 = str.substr(0,i)+str.substr(i+1);
for(int j =0;j<n-1;j++)
{
string s2 = s1.substr(0,j)+str[i]+s1.substr(j);
if(is_valid(s2,s2.length()))
ans.insert(s2);
}
}
cout<<ans.size()-1<<endl;
return 0;
}