括号对齐问题

解法一:左右括号成一对则抵消

             可以将左括号看成1右括号看成 -1,然后对8个数进行全排列

             对每个排列判断,是否符合条件,逐个相加,sum>=0直到遍历完该序列,

             符合条件则count++

             如果出现sum<0则失败

解法二:采用八位bit,从0000 0000 1111 1111遍历,遇到0 -1遇到1 1

           如果加完该序列所有位等于0,且递加过程中sum始终大于零则符合条件

#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=4;
	MatchNums(n,n,v);
	return 1;
}

可能单独看代码会感觉很难理解,毕竟里面使用了递归,不要紧,其实代码的含义十分的简单,要快速理解它我们需要明确以下几点原则:
      1、我们将一对括号分为单独的两部分:左括号和右括号。然后从0个开始一个一个添加左括号或右括号。
      2、为使括号组合都是合理的,第一个添加的必须是左括号,最后一个添加的必须是右括号。

#include <iostream> 
#include <string> 
using namespace std; 
void bracketMatch(string bracketString,int left,int right){
if(right==0){
   cout<<bracketString<<endl;
   return;
}
else             /*可通过在左括号添加语句前对连续出现左括号的个数的判断来决定下面的左括号添加操作是否执行以控制括号嵌套的深度*/
   if(left==right){    //此时只能添加左括号
      bracketString+="<";     
     bracketMatch(bracketString,--left,right);
     }
     else
    if(left<right&&left>0){    //此时可以有添加左括号或右括号两种情况
          string temp=bracketString;
         bracketString+="<";
         bracketMatch(bracketString,--left,right);
         left++;
         temp+=">";
           bracketMatch(temp,left,--right);
         }
         else
     if(left==0){      //只能添加右括号了
              bracketString+=">";
              bracketMatch(bracketString,left,--right);
             }
}
int main(){
string s;
int num;
cout<<"请输入括号的对数:"<<endl;
while(cin>>num){
   s="";
   cout<<"所有合理的括号匹配形式为:"<<endl;
     bracketMatch(s,num,num);
}
return 0;
}
#include <iostream>
#include <math.h>
using namespace std;
void MatchNums(int a[],int n){
	int num=pow((double)2,n);
	for(int i=0;i<num;++i){
		int sum=0;
		bool signal=true;
		int j=i;
		int count=n-1;
		while(count>=0){
			if((j%2)==1){
				a[count]=1;
				j=j>>1;
			}
			else{
				a[count]=-1;
				j=j>>1;
			}
			--count;
		}
		for(int k=0;k<n;k++){
			sum+=a[k];
			if(sum<0){
				signal=false;
				break;				
			}
		}
		if((sum!=0)&&signal)
			signal=false;
		if(signal){
			for(int k=0;k<n;k++){
				if(a[k]==1)
					cout<<"(";
				else
					cout<<")";
			}
			cout<<endl;
		}
	}
}
int main(){
	int a[8];
	int n=8;
	MatchNums(a,n);
	system("pause");
	return 1;
}

  

猜你喜欢

转载自1527zhaobin.iteye.com/blog/1663632