LeetCode第21题之Generate Parentheses(两种解法)
2016-06-02 11:28
423 查看
C++代码:
解法一(在LeetCode上运行效率高于解法二):
解法二:
解法一(在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 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解