zoukankan      html  css  js  c++  java
  • 301. 删除无效的括号 (JAVA)

    给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。

    返回所有可能的结果。答案可以按 任意顺序 返回。

    示例 1:

    输入: "()())()"
    输出: ["()()()", "(())()"]
    示例 2:

    输入: "(a)())()"
    输出: ["(a)()()", "(a())()"]
    示例 3:

    输入: ")("
    输出: [""]

    思路:这种一步一步生成答案合集的,一般使用递归。

    class Solution {
        public List<String> removeInvalidParentheses(String s) {
            int leftCount = 0;
            int rightCount = 0;
            int leftErr = 0;
            int rightErr = 0;
            result = new HashSet<>();
    
            for(int i = 0; i < s.length(); i++){
                if(s.charAt(i) == '(') {
                    leftCount++;
                } else if(s.charAt(i) == ')'){
                    if(leftCount > 0) {
                        leftCount--;
                    } else {
                        rightErr++;
                    }
                }
            }
            leftErr = leftCount;
    
            dfs(s, 0, leftErr, rightErr);
            return new ArrayList(result);
        }
    
        private void dfs(String s, int index, int leftErr, int rightErr){
            
            if(leftErr == 0 && rightErr == 0) {
                if(checkValid(s)) {
                    result.add(s);
                }
                return;
            } 
    
            if(index == s.length()) {
                return;
            }
    
            String tmpStr;
            if(s.charAt(index) == '(' && leftErr > 0) {
                tmpStr=s.substring(0, index)+s.substring(index+1);
                dfs(tmpStr, index, leftErr-1, rightErr);
            } else if(s.charAt(index) == ')' && rightErr > 0) {
                tmpStr=s.substring(0, index)+s.substring(index+1);
                dfs(tmpStr, index, leftErr, rightErr-1);
            } 
            dfs(s, index+1, leftErr, rightErr);
        }
    
        private boolean checkValid(String s) {
            int leftCount = 0;
            for(int i = 0; i < s.length(); i++){
                if(s.charAt(i) == '(') {
                    leftCount++;
                } else if(s.charAt(i)==')'){
                    if(leftCount > 0) {
                        leftCount--;
                    } else {
                        return false;
                    }
                }
            }
            if(leftCount != 0){
                return false;
            } else {
                return true;
            }
        }
        private Set<String> result;
    }
  • 相关阅读:
    [luogu5665]划分
    [luogu5666]树的重心
    [bzoj1854]游戏
    [bzoj1853]幸运数字
    [bzoj2245]工作安排
    [bzoj1426]收集邮票
    [bzoj2396]神奇的矩阵
    [bzoj1858]序列操作
    [bzoj1863]皇帝的烦恼
    [bzoj1432]Function
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/14706918.html
Copyright © 2011-2022 走看看