22. Generate Parenthese

题目:

解答:

使用穷举形式,对((()))形式的的初始串的第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)

猜你喜欢

转载自blog.csdn.net/u013434984/article/details/83930788