301. Remove Invalid Parentheses 去掉不合理的括号

原创 2016年08月31日 16:10:12

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.

Note: The input string may contain letters other than the parentheses ( and ).

Examples:

"()())()" -> ["()()()", "(())()"]
"(a)())()" -> ["(a)()()", "(a())()"]
")(" -> [""]


解题过程:

用BFS,因为这样的话,对于一个初始s,遍历它,并减去一个不合理的符号,得到的第一层就是全是n-1长度的,当减去一些后得到一个合理的字符串时,停止剪。那么这个层数就是减去的个数也是最小减去个数得到的结果。

当root层时s有长度n,则到第二层时,有c(n,n-1)个长度为n-1的子串,同时进行验证是时间为O(n-1),因此第一层的时间复杂度为O(n-1)*c(n,n-1);同理第二层的时间复杂度为O(n-2)*c(n-1,n-2)。。。。

一共的时间复杂度为 

T(n) = n x C(n, n) + (n-1) x C(n, n-1) + ... + 1 x C(n, 1) = n x 2^(n-1).


注意下面代码有个地方要注意:

就是当验证到正确的字符串时,要使found等于true,因为这样的话,就等于不用再对队列中的字符串进行剪了,只要把队列中剩下的字符串进行验证就行了。

开始时,我将continue写到if(isvalid(str))的范围里了,这样的话,当队列中的其他字符串取出进行验证发现不正确时,还会继续往下减,这样就不对了,因为已经得到了进行最少步剪的步数的到的结果了。


代码如下:


class Solution {
public:
    bool isvalid(string s){
        int count = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == '(')
            count++;
            else if(s[i] == ')')
            count--;
            if(count < 0)
            return false;
        }
        return count == 0;
    }

    vector<string> removeInvalidParentheses(string s) {
        set<string> sets;
        vector<string>res;
        queue<string>q;
        q.push(s);
        sets.insert(s);
        bool found =false;
        while(!q.empty()){
            string str = q.front();
            q.pop();
            if(isvalid(str)){
                res.push_back(str);
                found = true;
            }
            if(found) continue;
            for(int i = 0; i < s.size(); i++){
                if(str[i] == '(' || str[i] == ')'){
                    string strs = str.substr(0,i) + str.substr(i+1);
                    if(sets.find(strs) == sets.end()){
                        sets.insert(strs);
                        q.push(strs);
                    }
                }
            }
        }
        return res;
    }
};




[leetcode] 301. Remove Invalid Parentheses

题目: Remove the minimum number of invalid parentheses in order to make the input string valid. Retur...
  • u014673347
  • u014673347
  • 2016年02月18日 10:44
  • 917

301. Remove Invalid Parentheses (Hard)

原题目:    Remove the minimum number of invalid parentheses in order to make the input string valid. R...
  • wyh476901857
  • wyh476901857
  • 2017年04月11日 19:36
  • 614

LeetCode 301 Remove Invalid Parentheses (BFS + 剪枝)

LeetCode 301 Remove Invalid Parentheses (BFS + 剪枝)
  • Tc_To_Top
  • Tc_To_Top
  • 2016年10月08日 09:39
  • 616

Remove Invalid Parentheses

题目来源 leetcode 301 给定一个包含许多左括号和右括号的字符串,删除最少的括号,使得删除括号后的字符串中的括号匹配,要求输出所有结果。 首先来计算一下究竟最少要删除多少个左括号和右括号...
  • Alliyou
  • Alliyou
  • 2016年10月09日 18:33
  • 112

[leetcode] 301. Remove Invalid Parentheses 解题报告

题目链接:https://leetcode.com/problems/remove-invalid-parentheses/ Remove the minimum number of invali...
  • qq508618087
  • qq508618087
  • 2015年12月26日 16:00
  • 3746

301. Remove Invalid Parentheses

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all...
  • wdlsjdl2
  • wdlsjdl2
  • 2016年07月09日 10:48
  • 422

【Leetcode】301. Remove Invalid Parentheses 移除非法小括号

题目https://leetcode.com/problems/remove-invalid-parentheses/?tab=Solutions。 题意是给出一个string,其中的小括号可能不配对...
  • u010900754
  • u010900754
  • 2017年02月21日 12:32
  • 347

leetcode.301. Remove Invalid Parentheses

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all...
  • happyxuma1991
  • happyxuma1991
  • 2016年05月26日 22:41
  • 470

leetcode刷题,总结,记录,备忘 301

leetcode301Remove Invalid Parentheses Remove the minimum number of invalid parentheses in order to...
  • guicaisa
  • guicaisa
  • 2016年05月02日 20:23
  • 343

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

【022-Generate Parentheses(生成括号)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given n pairs of parentheses, ...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月23日 07:52
  • 2371
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:301. Remove Invalid Parentheses 去掉不合理的括号
举报原因:
原因补充:

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