删除无效的括号

简介: 删除无效的括号

题目

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

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

示例 1:

输入:s = "()())()"
输出:["(())()","()()()"]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-invalid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

首先
怎么判断一一个括号字符串是有效的
假设我不考虑左括号多的情况,我只考虑右括号多的情况,那么我从头到尾遍历整个字符串
有两个东西:
i:检查的位置,
j:可能删除的位置
一开始i, j都在0位置
count:
一个变量,遇到左括号++,右括号--
如果count没有到0以下,说明每一个右括号都能找到与之配对的左括号
当右括号多的时候,就要删除了

递归函数

设计递归函数f(i,j)
i检查位置,j删除位置
f(i,j), 一开始是f(0, 0)
检查位置从0开始查起,删除位置从0开始
image.png

如果要删除括号,调用递归f(i,j)
直接return当前递归,后续过程交给后面的递归

当遍历完count记录左括号
在遍历count记录右扩号
最后得出答案

代码

    public static List<String> removeInvalidParentheses(String s) {
        List<String> ans = new ArrayList<>();
        remove(s, ans, 0, 0, new char[] { '(', ')' });
        return ans;
    }
    public static void remove(String s, List<String> ans, int checkIndex, int deleteIndex, char[] par) {
        for (int count = 0, i = checkIndex; i < s.length(); i++) {
            if (s.charAt(i) == par[0]) {
                count++;
            }
            if (s.charAt(i) == par[1]) {
                count--;
            }
            // i check计数<0的第一个位置
            if (count < 0) {
                for (int j = deleteIndex; j <= i; ++j) {
                    // 比如
                    if (s.charAt(j) == par[1] && (j == deleteIndex || s.charAt(j - 1) != par[1])) {
                        remove(
                                s.substring(0, j) + s.substring(j + 1, s.length()),
                                ans, i, j, par);
                    }
                }
                return;
            }
        }
        String reversed = new StringBuilder(s).reverse().toString();
        if (par[0] == '(') {
            remove(reversed, ans, 0, 0, new char[] { ')', '(' });
        } else {
            ans.add(reversed);
        }
    }
相关文章
|
4月前
|
算法 前端开发
从字符串中移除星号
从字符串中移除星号
44 0
|
4月前
|
算法 前端开发
3039. 进行操作使字符串为空
3039. 进行操作使字符串为空
38 0
|
4月前
leetcode-301:删除无效的括号
leetcode-301:删除无效的括号
41 0
|
10月前
|
JSON 小程序 JavaScript
小程序根据返回值是否为空判断标签是否显示
小程序根据返回值是否为空判断标签是否显示
72 0
|
4月前
判断字符类型
该内容描述了一个字符判断和转换的逻辑:输入字符,根据条件进行操作。如果字符是大写字母,转为小写;如果是小写字母,转为大写;若是数字,输出其ASCII值;否则输出&quot;错误&quot;。判断条件包括:大写字母ASCII值在&#39;A&#39;和&#39;Z&#39;之间,小写字母在&#39;a&#39;和&#39;z&#39;之间,数字在&#39;0&#39;和&#39;9&#39;之间。转换利用ASCII值差32的特性,通过if-else if语句实现。内容中还包括两幅示例图片,显示了程序执行的结果。
31 1
|
4月前
2390.从字符串中移除星号
2390.从字符串中移除星号
27 0
|
4月前
|
算法 测试技术 C#
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
|
4月前
|
C++
HRBUST - 1170(判断括号是否匹配)
HRBUST - 1170(判断括号是否匹配)
|
4月前
|
算法 前端开发
删除最外层的括号
删除最外层的括号
47 0
|
4月前
|
存储 前端开发 Java
去掉参数中第一个“,”
去掉参数中第一个“,”
46 0