题目:https://leetcode.com/problems/generate-parentheses/
思路:
主要问题是,什么时候可以加左括号,什么时候可以加右括号。这需要判断当前已有字串的左右括号个数,有以下三种情况:
- 如果当前左括号的数目等于(也可以说小等于,不过小于的情况是出错了)右括号了,比如(),那只能加左括号;
- 如果当前左括号数目大于右括号,比如(((),那么
- 如果还有剩左括号的配额,可以加左括号(新分支了);
- 否则只能加右括号(在原有答案上操作即可);
代码:
class Solution { public: vector<string> generateParenthesis(int n) { vector<string> results; vector<pair<int, int>> parSize; // If size('(') <= size(')'), we can only append '('; // Else, append '(' or ')' if it doesn't reach the quota int count = 1; results.push_back(string("(")); parSize.push_back(pair<int, int>(1, 0)); int resultSz; while (count < n * 2) { resultSz = results.size(); int lsize, rsize; for (int i = 0; i<resultSz; i++) { lsize = parSize[i].first; rsize = parSize[i].second; if (lsize <= rsize) { results[i] += "("; parSize[i].first++; } else { if (lsize < n) { string cpStr = results[i] + "("; pair<int, int> cpSz = parSize[i]; cpSz.first++; results.push_back(cpStr); parSize.push_back(cpSz); } results[i] += ")"; parSize[i].second++; } } count++; } return results; } };