lintcode--生成括号

来源:互联网 发布:ubuntu搭建网络电话 编辑:程序博客网 时间:2024/06/09 04:51

题目描述:
给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。

样例:
给定 n = 3, 可生成的组合如下:
“((()))”, “(()())”, “(())()”, “()(())”, “()()()”

思路讲解:
我们首先看一下n=1、2、3时组合的结果:
当n=1,”()”
当n=2,”()()”、”(())”
当n=3,”((()))”, “(()())”, “(())()”, “()(())”, “()()()”
我们可以发现2是在1的基础上添加的”()”,可以在前面、中间、后面添加,得到的结果是”()()”、”(())”、”()()”,这个时候我们去重就可以得到n=2时,组合结果是”()()”、”(())”。同样我们通过n=2的结果,得到n=3的结果”()()()”、”(())()”、”()()()”、”()(())”、”()()()”、”()(())”、”(()())”、”((()))”、”(()())”、”(())()”,然后去重就得到了”((()))”, “(()())”, “(())()”, “()(())”, “()()()”,这就是n=3的组合结果了。这样我们就可以一步步的迭代得到我们想要的结果。这里去重是使用vector中的unique函数。

代码详解:

class Solution {public:    /*     * @param n: n pairs     * @return: All combinations of well-formed parentheses     */    vector<string> generateParenthesis(int n) {        // write your code here        vector<vector<string>>res(n);        res[0].push_back("()");        if(n==1){            return res[0];        }        for(int i=1;i<n;i++)        {            int len=res[i-1].size();            cout<<len<<endl;            for(int j=0;j<len;j++)            {                int strlen1=res[i-1][j].length();                cout<<strlen1<<endl;                for(int k=0;k<strlen1;k++){                    string s1=res[i-1][j].substr(0,k-0);//添加括号位置的前面的字符串                    string s2=res[i-1][j].substr(k,strlen1-k);//添加括号位置的后面的字符串                    string s=s1+"()"+s2;                    //cout<<"1111 "<<s<<endl;                    res[i].push_back(s);                }                res[i].push_back(res[i-1][j]+"()");            }            printvector(res[i]);            sort(res[i].begin(),res[i].end());//排序            res[i].erase(unique(res[i].begin(),res[i].end()),res[i].end());//去重        }        return res[n-1];    }    void printvector(vector<string>res)    {        for(int i=0;i<res.size();i++)        {            cout<<res[i]<<" ";        }        cout<<endl;    }};
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机触屏太灵敏怎么办 华硕触摸屏失灵怎么办 ipad换屏后乱跳怎么办 手机屏幕突然失灵怎么办 按键不灵敏了怎么办 小米死机了怎么办 小米手机屏幕不灵敏怎么办 iphone5滑动失灵怎么办 电脑滑动失灵怎么办 sim卡槽坏了怎么办 手机进水后跳屏怎么办 手机屏幕烧坏了怎么办 华为手机屏幕不灵敏怎么办 手机屏幕有残影怎么办 su卡怎么办 su卡顿怎么办 苹果8玩吃鸡卡怎么办 玩吃鸡手机卡顿怎么办 玩手机游戏卡怎么办 苹果停用怎么办 iphone4锁死了怎么办 苹果手机屏锁死怎么办 苹果七死机怎么办 苹果七白屏死机怎么办 苹果电脑黑屏了怎么办 iphone7不能开机怎么办 苹果五黑屏怎么办 苹果8黑屏怎么办 苹果ipad总闪退怎么办 手机按键不管用怎么办 苹果se黑屏怎么办 iphonex黑屏怎么办 iphone6黑屏怎么办啊 手机屏滑打不开怎么办 无法滑屏怎么办 手机屏幕不能按怎么办 vivox7黑屏了怎么办 iphone屏幕点不亮怎么办 iphone慢慢黑屏怎么办 苹果电脑无法开机怎么办 手机摔出黑块怎么办