LeetCode第21题之Generate Parentheses(两种解法)

原创 2016年06月02日 11:28:54

C++代码:
解法一(在LeetCode上运行效率高于解法二):

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

class Solution {
private:
    vector<string> res;
public: 
    //leftRemain保存还可以放左括号的数目,rightRemain保存还可以放右括号的数目
    void dfs(string state, int leftRemain, int rightRemain)
    {
        //这种情况括号不匹配
        if (leftRemain > rightRemain)
        {
            return;
        }
        if (0 == leftRemain && 0 == rightRemain)
        {
            res.push_back(state);
            return;
        }
        if (leftRemain > 0)
        {
            dfs(state + "(", leftRemain -1, rightRemain);
        }
        if (rightRemain >0 )
        {
            dfs(state + ")", leftRemain, rightRemain-1);
        }
    }
    vector<string> generateParenthesis(int n) {
        dfs("",n,n);
        return res;
    }
};

int main()
{
    Solution s;
    vector<string> r = s.generateParenthesis(3);
    for (vector<string>::iterator it = r.begin();it != r.end();++it)
    {
        cout<<*it<<endl;
    }
    return 0;
}

解法二:

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

class Solution {
private:
    //保存结果
    vector<string> res;
public:
    void fun(int deep, int n, int leftNum, int leftTotalNum, string s)
    {
        //如果左括号的总数大于n,则该字符串不可能满足要求
        if (leftTotalNum  > n)
        {
            return;
        }
        //如果到达最底层,则s一定满足题意。因为运行到这里时,leftTotalNum<=n,而leftNum>=0
        if (n*2 == deep)
        {
            res.push_back(s);
            return;
        }
        for (int i=0;i<2;++i)
        {
            if (0 == i)
            {
                //在deep+1的位置放左括号
                fun(deep+1, n, leftNum+1, leftTotalNum+1, s + "(");
            }
            else
            {
                //如果有剩余未匹配的左括号数,才能放右括号
                if (leftNum > 0)
                {
                    fun(deep+1, n, leftNum-1, leftTotalNum, s + ")");
                }
            }
        }
    }
    vector<string> generateParenthesis(int n) {
        //剩余未匹配的左括号数
        int leftNum = 0;
        //字符串中左括号总数
        int leftTotalNum =0;
        string s = "";
        fun(0, n, leftNum, leftTotalNum, s);
        return res;
    }
};

int main()
{
    Solution s;
    vector<string> r = s.generateParenthesis(3);
    for (vector<string>::iterator it = r.begin();it != r.end();++it)
    {
        cout<<*it<<endl;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode】LeetCode——第21题:Merge Two Sorted Lists

【LeetCode】LeetCode——第21题:Merge Two Sorted Lists
  • hujingshuang
  • hujingshuang
  • 2016年05月03日 10:27
  • 811

LeetCode算法题目解答汇总(转自四火的唠叨)

LeetCode算法题目解答汇总 本文转自《四火的唠叨》 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少。我的初衷就是练习,因为...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2016年12月28日 11:21
  • 400

【LeetCode-面试算法经典-Java实现】【022-Generate Parentheses(生成括号)】

【022-Generate Parentheses(生成括号)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given n pairs of parentheses, ...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月23日 07:52
  • 2378

leetcode21题 题解 翻译 C语言版 Python版

21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list ...
  • yingzinanfei
  • yingzinanfei
  • 2016年04月14日 19:49
  • 769

LeetCode刷题指南(一)

以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目前,已经有321个问题了。对于大多数人来说,没有时间也没有必要把所有题目都做一遍(时间充裕可以随意)。刷个100题左...
  • Lnho2015
  • Lnho2015
  • 2016年03月23日 15:02
  • 38110

leetcode刷题经验

语言不是最重要的,思想最重要从做上面的题,我发现我更擅长一些数学技巧不高的程序题,习惯靠直觉立马书写代码,而非严格推理之后,再书写代码对于链表的题比较擅长,链表可以在纸上画画,关键要考虑的问题,就是链...
  • basycia
  • basycia
  • 2016年02月28日 15:31
  • 1366

简单的leetcode题(四)

Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be w...
  • mjw110420117
  • mjw110420117
  • 2016年04月15日 00:30
  • 579

Leetcode算法题分类解析:(一)总览

Leetcode算法题分类解析:(一)总览1.为何/如何刷题1.1 必要性刷题刷题,从“刷”字就能看出其中的机械性和应试性,但这就是几乎所有IT公司面试中的一环。尽管面试者可能也对这种考察方式不是很满...
  • dc_726
  • dc_726
  • 2016年06月17日 23:01
  • 5924

关于leetcode第三题的巧妙解法

最近在leetcode上刷题,无聊看到第三题,题干如下:   Longest Substring Without Repeating Characters:   Given a string, fi...
  • ysayk
  • ysayk
  • 2016年05月26日 11:38
  • 1529

[LeetCode刷题笔记] 关于LeetCode的前言

又到了一年毕业就业季了,三年前的校招季我逃避了,可这一次终于还是要轮到我了=_=||。 作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢? LeetCode收录了许多互联网...
  • tostq
  • tostq
  • 2016年07月22日 21:32
  • 2985
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode第21题之Generate Parentheses(两种解法)
举报原因:
原因补充:

(最多只允许输入30个字)