LeetCode OJ 之 GenerateParenthesis解题报告

//********************************************************************
//** 创建人: larriers
//** 日  期 : 2016 / 03 / 23   12:35
//** 版  本 : 1.0
//** 描  述 : 给定一个数字,代表括号对的个数,然后输出所有可能的排序情况,注意括号要匹配
//** 思  路 : 1. 先判断n值是否大于0,若不大于零直接执行第5步操作
//**          2. 先将“(”放入容器中
//**		  3. 检验容器中的每一个字符串是否已经完成(完成的意思是字符串的长度是括号对个数的二倍),如果全部完成,执行第5步,否则,执行下一步
//**		  4. 对容器中的每个字符串进行如下判断:
//**				a. 判断当前字符串是否已经完成,如果完成,结束当前字符串判断,指定d步;如果未完成,执行b步
//**				b. 判断当前字符串的左括号数目是否等于n,如果等于,则直接向这个字符串尾部添加")"字符,然后执行第d步,如果不等于,执行c步
//**				c. 判断当前字符串是否存在尚未匹配的左括号(如果存在,则说明存在可添加"("和")"两种可能)
//**					如果存在,则将当前字符串+")"放入容器中(这是一个新的字符串),并将当前字符串添加一个"("
//**					如果不存在,则将当前字符串添加一个"("
//**				c. 执行下一个字符串判断,如是最后一个,则结束循环判断,
//**		  4. 结束函数并返回容器
//**				
//** 测  试 :n=2,n=3,n=4,n=5,n=6,n=7,n=8
//** 应  用 : 实现按照一定规则动态生成匹配括号串


//**************************** 修改记录 ******************************
//** 修改人 :
//** 日  期 :
//** 描  述 :
//******************************************************************** 

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


class Solution {
public:
	// 计算当前串中还存在有几个未匹配的左括号,并返回括号数目
	int countLeftBraceExits(string str)
	{
		stack<char> charStack;
		for (int i = 0; i < str.length(); i++)
		{
			switch (str[i])
			{
			case '(':
				charStack.push(str[i]);
				break;
			case ')':
				if (charStack.top()=='(')
				{
					charStack.pop();
				}
				break;
			default:
				break;
			}
		}
		return charStack.size();


		/*测试函数
		Solution s;
		string str = "(";
		string str1 = "(((";
		string str2 = "((()";
		string str3 = "(()()";
		string str4 = "((()))";
		string str5 = "()()()";
		cout << s.countLeftBraceExits(str) << endl;
		cout << s.countLeftBraceExits(str1) << endl;
		cout << s.countLeftBraceExits(str2) << endl;
		cout << s.countLeftBraceExits(str3) << endl;
		cout << s.countLeftBraceExits(str4) << endl;
		cout << s.countLeftBraceExits(str5) << endl;
		*/
	}
	// 检验当前容器中的每个串是否是已经完成状态
	bool checkVectorFinish(int n, vector<string> vecstr)
	{
		for (int i = 0; i < vecstr.size(); i++)
		{
			if (vecstr[i].length()<2*n)
			{
				return false;
			}
		}
		return true;
	}
	// 计算现在有几个左括号
	int countLeftBrace(string str)
	{
		int resultInt = 0;
		for (int i = 0; i < str.length(); i++)
		{
			if (str[i]=='(')
			{
				resultInt++;
			}
		}
		return resultInt;
	}
	// 计算现在有几个右括号
	int countRightBrace(string str)
	{
		int resultInt = 0;
		for (int i = 0; i < str.length(); i++)
		{
			if (str[i] == ')')
			{
				resultInt++;
			}
		}
		return resultInt;
	}
	// 将每一种
	vector<string> generateParenthesis(int n) {
		vector<string> vectorStr;
		vector<bool> vectorBoolFinish;
		bool initBoolStr = false;
		string initStr = "(";
		if (n>0)
		{
			string pushStr = "";
			vectorBoolFinish.push_back(initBoolStr);
			string sTemp = "";
			vectorStr.push_back(initStr);
			int vectorIndex = 0;
			while (checkVectorFinish(n, vectorStr) == false)//还存在字符串未完成
			{
				vectorIndex = 0;
				while (vectorIndex != vectorStr.size())// 遍历每个字符串
				{/*countLeftBraceExits(vectorStr[vectorIndex])*/
					if (vectorStr[vectorIndex].length()<2 * n)//当前字符串未完成
					{
						// 左括号已经用完了
						if (n - countLeftBrace(vectorStr[vectorIndex]) == 0)
						{
							vectorStr[vectorIndex].append(")");
						}
						// 还有左括号没用完,下一个可能是左括号也可能是右括号,如果是左括号就直接加进去,如果不是的话,再写一个字符串加进容器里面
						else
						{
							//存在未匹配的左括号,那么此时就存在可以加左括号可以加右括号两种可能
							if (countLeftBraceExits(vectorStr[vectorIndex])>0)
							{
								pushStr = vectorStr[vectorIndex] + ")";
								vectorStr.push_back(pushStr);
								vectorStr[vectorIndex].append("(");

							}
							else
							{
								vectorStr[vectorIndex].append("(");
							}
						}
					}
					vectorIndex++;
				}
			}
		}
		return vectorStr;
	}
};
int main()
{
	Solution s;
	int n = 0;
	cin >> n;
	cout << endl;
	vector<string> str=s.generateParenthesis(n);
	for (int i = 0; i < str.size(); i++)
	{
		cout << str[i] << endl;
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值