【栈】1249 移除无效的括号

2020-12-28  本文已影响0人  Spring_java

题目描述
给你一个由 '('、')' 和小写字母组成的字符串 s。
你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
请返回任意一个合法字符串。
有效「括号字符串」应当符合以 任意一条 要求:
空字符串或只包含小写字母的字符串
可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」
示例 1:

输入: s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。

示例 2:
输入: s = "a)b(c)d"
输出:"ab(c)d"
示例 3:
输入: s = "))(("
输出:""
解释: 空字符串也是有效的
示例 4:
输入: s = "(a(b(c)d)"
输出:"a(b(c)d)"

作者:97wgl
链接:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses/solution/yi-chu-wu-xiao-de-gua-hao-zhan-by-97wgl/

解题思路:

1:需要删除最少的 括号,就是删除不匹配的括号。
思路1:

思路1 有个好方法,只是把括号入栈,其余的字符不需要。

思路2:
重点: 默认所有的右边下标是有效的。只把左边括号入栈
维护一个数组,表示要删除的不符合的括号,无效的。也存放下标
使用栈保存左边括号的下标。

存在的问题:
)a( 这种 结果是a
(a) 这种结果是 (a)

代码:

    private static void minRemoveToMakeValid2(String s) {
        Stack<Integer> bracketIndex = new Stack<>();
        boolean[] invalidIndex = new boolean[s.length()];
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                bracketIndex.push(i);
                invalidIndex[i] = true;
            }
            if (s.charAt(i) == ')') {
                if (bracketIndex.empty()) {
                    invalidIndex[i] = true;
                } else {
                    invalidIndex[bracketIndex.pop()] = false;
                }
            }
        }
        for (int i = 0; i < s.length(); i++) {
            if (!invalidIndex[i]) {
                result.append(s.charAt(i));
            }
        }
        System.out.println(result.toString());
    }
上一篇 下一篇

猜你喜欢

热点阅读