zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    翻转数组
    股神
    刮刮卡兑换
    军训队列
    击鼓传花
    上台阶
    @Service空指针异常 -JUNIT测试
    insert 配置信息
    url地址重叠
    shop = mapper.readValue(shopStr, Shop.class); shop=null的问题
  • 原文地址:https://www.cnblogs.com/skillking/p/10032961.html
Copyright © 2011-2022 走看看