原文链接: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; } };

 

posted on 2017-11-26 19:55  newbird2017  阅读(127)  评论(0编辑  收藏  举报