一道搜狐笔试题,
对于2对左右括号,其排列方式有:
( ( ) )( ) ( )
共2种合法匹配,如果3对括号,则有以下5种:
( ( ( ) ) )
( ) ( ) ( )
( ( ) ) ( )
( ( ) ( ) )
( ) ( ( ) )
编程实现,输入括号对数n,输出所有合法匹配的排列。
思想:使用递归,递归过程中用到了对当前排列合法性的判断,使用vector是因为很方便进行push和pop操作
#include<iostream>
#include <vector>
using namespace std ;
void Print(vector<char> v)
{
for (vector<char>::iterator beg=v.begin();beg!=v.end();++beg)
cout<<*beg<<" ";
cout<<endl;
}
void MatchNums(int nSize,int nLen,vector<char> &v)
{
int nLeftBrackets=0;
int nRightBrackets=0;
for (vector<char>::iterator beg=v.begin();beg!=v.end();++beg)
{
if(*beg=='(')
nLeftBrackets++;
else
nRightBrackets++;
// 右括号比左括号多,匹配失败
if(nRightBrackets>nLeftBrackets)
return;
// 匹配成功,打印
if(nLeftBrackets+nRightBrackets == nSize && nLeftBrackets == nRightBrackets)
Print(v);
}
if (nLen>0)
{
// 尝试加入左括号,并匹配
v.push_back('(');
MatchNums(nSize, nLen-1, v);
v.pop_back();
// 尝试加入右括号,并匹配
v.push_back(')');
MatchNums(nSize, nLen-1, v);
v.pop_back();
}
}
int main()
{
vector <char> v;
int n;
cin >> n;
MatchNums(2*n,2*n,v);
return 1;
}