//********************************************************************
//** 创建人: 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;
}
LeetCode OJ 之 GenerateParenthesis解题报告
最新推荐文章于 2019-02-11 00:02:02 发布