301. Remove Invalid Parentheses

一、题目

  1、审题 

  

  2、分析

    给出一个包含 '('、')' 的字符串,去除最少的字符,使得左右括号能正确闭合。求出所有的正确闭合的字符串。

 

二、解答

  1、思路

    https://leetcode.com/problems/remove-invalid-parentheses/discuss/75027/Easy-Short-Concise-and-Fast-Java-DFS-3-ms-solution

    ①、从左向右扫描,判断是否有多余的 ')',若在 i 位置时有 ')' 多余,则从头开始扫描,若有 ')' 出现,且其前面一个字符不是 ')' 则吧这个字符去除。

    ②、通过步骤 ① 可以去除多余的 ')'。

    ②、 将字符串翻转,判断 是否有多余的 '(';

public List<String> removeInvalidParentheses(String s) {
        List<String> ans = new ArrayList<String>();
        remove(s, ans, 0, 0, new char[]{'(', ')'});
        return ans;
    }

    //     last_i 之前的都已匹配; last_j: 从 last_j 开始去除一个多余的 ")"
    private void remove(String s, List<String> ans, int last_i, int last_j, char[] par) {
        
        // i < s.length();
        for (int stack = 0, i = last_i; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(ch == par[0]) 
                stack++;
            else if(ch == par[1]) 
                stack--;
            if(stack >= 0)
                continue;
            // stack < 0
            for (int j = last_j; j <= i; ++j) //step1: 判断 ")" 是否匹配。
                if(s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1])) // 不是连续的 "))" 的情况
                    remove(s.substring(0, j) + s.substring(j + 1), ans, i, j, par);
            return;
        }
        
        // 从上一个 for 中跳出来了,不容易啊!从左向右是满足匹配的。
        String reversed = new StringBuilder(s).reverse().toString();
        if(par[0] == '(') //step2: 在判断 "(" 是否匹配。
            remove(reversed, ans, 0, 0, new char[]{')', '('});
        else
            ans.add(reversed);
    }

 

posted @ 2018-11-28 16:36  skillking2  阅读(92)  评论(0编辑  收藏