问题描述
由1对括号,可以组成一种合法括号序列:()。
由2对括号,可以组成两种合法括号序列:()()、(())。
由4对括号组成的合法括号序列一共有多少种?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案
14
(((())))
((()()))
((())())
((()))()
(()(()))
(()()())
(()())()
(())(())
(())()()
()((()))
()(()())
()(())()
()()(())
()()()()
#include <bits/stdc++.h>
using namespace std;
int n,num=0;
void dfs(int l,int r,int n,string s,int &num)
{
if(r==n)
{
cout<<s<<endl;
num++;
return;
}
if(r==l)
{
s.append("(");
l++;
dfs(l,r,n,s,num);
}
else//r<l
{
if(l==n)
{
s.append(")");
r++;
dfs(l,r,n,s,num);
}
else
{
s.append("(");
l++;
dfs(l,r,n,s,num);
s.pop_back();
l--;
s.append(")");
r++;
dfs(l,r,n,s,num);
}
}
return ;
}
int main()
{
cin>>n;
string s;
dfs(0,0,n,s,num);
cout<<num;
return 0;
}
在此借用了marginyl大佬的文章
思路:问题可转化为:在一个string中包含两个字符:’(‘和’)’,他们出现的次数都为n,并且任何时候’(‘出现的次数总是>=’)'出现的次数。
解决方案(递归):
标志:l: 左括号出现的次数,r:右括号出现的次数,n: 括号对数,s: 存储符合要求的排列字符串,num: 匹配排列种数
步骤:
1.如果r=n,即右括号已出现了n次,则num++,打印s,返回;
2.如果r=l,即左右括号出现次数相等(且<n,这由1知),则在s后面append字符‘(’,并l++,回到1(递归)
3.如果r<l,即右括号出现次数小于左括号,分两种情况
(1),l=n,即左括号全部出现,则在s后面append字符')',并r++,回到1(递归)
(2),l<n,则接下来出现的字符可能是'(',也可能是')'。可以:
在s后append字符‘(’,l++,回到1(递归);然后把s最后的字符'('pop出来,append字符‘)’,l--,r++,再回到1(递归)
原文链接:https://blog.csdn.net/u014529413/article/details/39119273
以下是判断括号序列是否合法的代码
#include <bits/stdc++.h>
using namespace std;
int n;
int main(void)
{
stack <char> s;
string str;
char c;
cin>>str;
for(int i=0; i<str.size(); i++)
{
if(str[i]=='('||str[i]=='['||str[i]=='{')
{
s.push(str[i]);
continue;
}
if(str[i]==')')
{
c=s.top();
if(c=='(')s.pop();
else break;
}
if(str[i]==']')
{
c=s.top();
if(c=='[')s.pop();
else break;
}
if(str[i]=='}')
{
c=s.top();
if(c=='{')s.pop();
else break;
}
}
if(s.empty())cout<<"true"<<endl;
else cout<<"false"<<endl;
return 0;
}