原文链接:https://leetcode.com/problems/generate-parentheses
给出数字n,求n对括号组成的合法字符串。
刚做出来,敲完代码,修改了一次,然后提交,accepted ~ 还是小有成就感的。。菜鸟...
先记录下自己的笨方法。再研究更高妙的方法。
刚看到题也是一头雾水。没法深入思考,感觉就是不断的罗列,被题目吓到了。
仔细观察,合法字符串的第一个字母肯定是( ,最后一个肯定是)。
对于合法字符串的每一位,必定有 左括号的个数 >= 右括号的个数。每一位都必须满足。
想法就是,从第一位开始向最后一位扩充,直到填满2*n位。
当填第i位的时候,考察前面左括号的个数left,和右括号的个数right。有下面三种情况:
1、left == right 左右括号相等了,这时候只能填左括号。
2、left == n , right < n 左括号已经有n个了,满了,只能填右括号了。
3、left < n && left > right 左括号还没满,且比右括号多。这时候,可以填两种。
本来想递推算,但是后来习惯性改成了循环。
用C太麻烦了!
C++的STL,边搜语法边照着敲的。肯定用的很蹩脚。见谅。
class Solution { public: vector<string> generateParenthesis(int n) { vector<int>left; //第i个字符串左括号的个数 vector<int>right; //第i个字符串右括号个数 vector<string> ans; int i,j,k;
string tmp("("); ans.push_back(tmp); //第一个字符串就是"(" left.push_back(1); //第一个字符串的左括号有一个 right.push_back(0); //右括号0。 for(i = 1; i<2*n; i++) //开始添加第i位。 { int len = ans.size(); for(j = 0;j < len; j++) //遍历每个字符串 { if(left[j] == right[j]) { ans[j].append(1,'('); left[j] ++; } else if(left[j]>right[j] && left[j] < n) { string tmp(ans[j]); tmp.append(1,'('); ans.push_back(tmp); left.push_back(left[j]+1); right.push_back(right[j]); ans[j].append(1,')'); right[j]++; } else if(left[j] == n) { ans[j].append(1,')'); right[j]++; } } } return ans; } };