1. 程式人生 > >n對括號可以有多少種匹配排列方式(演算法面試題)

n對括號可以有多少種匹配排列方式(演算法面試題)

問題:n對括號可以有多少種匹配排列方式?比如兩對括號可以有兩種:()()和(())

思路:問題可轉化為:在一個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(遞迴)

程式碼如下:

#include <string>
#include <iostream>
using namespace std;

void parenthesisArrayCount(int l,int r,int n,string s,int& num)
{
	if(r==n)
	{
		num++;
		cout<<s<<endl;
		return;
	}
	if(r==l)
	{
		s.append("(");
		l++;
		parenthesisArrayCount(l,r,n,s,num);
	}
	else//r<l
	{
		if(l==n)
		{
			s.append(")");
			r++;
			parenthesisArrayCount(l,r,n,s,num);
		}
		else
		{
			s.append("(");
			l++;
			parenthesisArrayCount(l,r,n,s,num);
			s.pop_back();
			l--;
			s.append(")");
			r++;
			parenthesisArrayCount(l,r,n,s,num);
		}

	}
	return;

}
int main()
{
	int num=0;
	string s;
	parenthesisArrayCount(0,0,4,s,num);
	cout<<"共"<<num<<"種";
	return 1;
}


執行結果: