题目:
解答:
使用穷举形式,对((()))
形式的的初始串的第k = n-1个‘)’做穷举左移,如果左侧也为’)'或者已经移动到2 * k - 1的位置时(可以移动的最左侧),k减一,直至所有的右括号都已经移动到对应的2 * k - 1的位置,穷举结束
代码:
class Solution {
public:
bool CheckStringEnd(char* s, int len){
for(int i = 0;i < len; ++i)
if((i&1) && s[i] != ')' || !(i&1) && s[i] != '(')
return false;
return true;
}
vector<string> generateParenthesis(int n) {
char s[256] = { 0 };
vector<string> result;
for(int i = 0;i < n;++i)
s[i] = '(';
for(int i = n;i < 2 * n; ++i)
s[i] = ')';
while(true){
result.push_back(s);
if(CheckStringEnd(s, 2 * n))
break;
// 每一个右括号,可以向前移动到的最大位置为[2k-1],其中最后一个右括号永远不可以移动
// 从倒数第二个开始计算
int k = n - 1;
while(true){
int cnt = 0, index = 0;
for(int i = 0;i < 2 * n; ++i){
if(s[i] == ')') ++cnt;
if(cnt == k) {
index = i;
break;
}
}
//如果不能swap,那么k左推1,且后面的初始化为()))类似格式
if(index == 2 * k - 1 || s[index-1] == ')'){
for(int i = index;i < n + k -1;++i)
s[i] = '(';
for(int i = n + k - 1;i < 2 * n - 1; ++i)
s[i] = ')';
--k;
}
else{
swap(s[index], s[index-1]);
break;
}
}
}
return result;
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)