资讯专栏INFORMATION COLUMN

leetcode 301. Remove Invalid Parentheses

zhisheng / 3080人阅读

摘要:一个合法的字符串是指左括号和右括号必定成对出现。要求得出用最少次数的删除可以得到的所有的合法字符串。最后两个结果重复,因此只保留,两个结果。最终生成的合法字符串为。方法相同于上一种情况。其中出现了两次。在该下标前的删除将会产生重复的结果。

题目要求
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.

Note: The input string may contain letters other than the parentheses ( and ).

Examples:
"()())()" -> ["()()()", "(())()"]
"(a)())()" -> ["(a)()()", "(a())()"]
")(" -> [""]

现在有一个字符串包含一些左右括号以及字母。一个合法的字符串是指左括号和右括号必定成对出现。要求得出用最少次数的删除可以得到的所有的合法字符串。

思路和代码

这道题目的思路源自于评论区。刚开始会有点难以理解,现在试图理清这个思路。

先从题目中给的例子入手:()())()
当遍历到第五个括号时,我们发现这个括号的存在非法。因此我们会从当前的三个右括号(下标分别为1, 3, 4)中选择一个删去。那么选择哪个呢?其实选择任意一个右括号都可以使当前的的子字符串合法,并依次生成如下三个结果(())()()()()。最后两个结果重复,因此只保留(())()()两个结果。最终生成的合法字符串为[()()(), (())()]

这里说明了一种情况,即右括号的数量多于左括号的数量。那么如何处理左括号的数量多于右括号数量的场景呢?如()(()
其实,我们只需要将其倒置为)(()(,并且将)(视为一组合法的括号即可。这时我们会看见下标2上的左括号不合法,对之进行处理即可。方法相同于上一种情况。

还要考虑一个问题,即出现重复的结果集的问题,就像例子中重复生成的的()()。我们如何才能避免使用Set来过滤掉重复的结果呢?

还是举一个例子:()())())
按照之前的处理,当我们遍历到下标4上的右括号时,我们有三个删除选择。而且我们发现当出现连续的右括号时,删除该连续括号中的任意一个产生的结果都相同。所以默认情况下,我们删除第一个括号。这时处理后的字符串为()()())以及(())())

再对()()())处理,同样的,当我们遇到最后一个右括号时,只需要删除任意一个右括号就可以使数组成为合法数组,那么我们先根据第一个原则,删除连续右括号的第一个括号,可以产生没有重复的结果为(()()),()(())()()()

同理(())())可以处理出结果(()())(())()。其中(()())出现了两次。我们如何避免这样的重复呢?这时我们需要记录一下最后一次删除所在的下标。在该下标前的删除将会产生重复的结果。这里我们看到最后一次删除的下标为3。对下标3之前的删除将会带来重复的结果(()())

public List removeInvalidParentheses(String s) {
        List result = new ArrayList();
        removeInvalidParentheses(s, result, 0, 0, new char[]{"(", ")"});
        return result;
    } 
    
    
    
    public void removeInvalidParentheses(String s, List result, int lastRemoveIndex, int lastCheckedIndex, char[] pattern){
        for(int stack = 0, i = lastCheckedIndex ; i=0) continue;
            for(int j = lastRemoveIndex ; j <= i ; j++){
                if(s.charAt(j)==pattern[1] && (j == lastRemoveIndex || s.charAt(j-1)!=pattern[1])){
                    removeInvalidParentheses(s.substring(0, j) + s.substring(j+1), result, j, i, pattern);
                }
            }
            return;
        }
        String reversed = new StringBuilder(s).reverse().toString();
        if(pattern[0] == "("){
            removeInvalidParentheses(reversed, result, 0, 0, new char[]{")", "("});
        }else{
            result.add(reversed);
        }
    }


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68755.html

相关文章

  • 301. Remove Invalid Parenthesis

    摘要:问题解答这题是看里面的的代码如果比大或等的话,就继续扫下去否则,我们就找到当前有可能删去的,然后删掉看新的如果只从左到右扫了,还是的时候,我们还要再从右往左扫一遍否则两遍都扫完了,就加入结果中去 问题:Remove the minimum number of invalid parentheses in order to make the input string valid. Ret...

    lentoo 评论0 收藏0
  • [LeetCode] 32. Longest Valid Parentheses

    Problem Given a string containing just the characters ( and ), find the length of the longest valid (well-formed) parentheses substring. Example 1: Input: (()Output: 2Explanation: The longest valid pa...

    Flink_China 评论0 收藏0
  • leetcode 部分解答索引(持续更新~)

    摘要:前言从开始写相关的博客到现在也蛮多篇了。而且当时也没有按顺序写现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。顺序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 从开始写leetcode相关的博客到现在也蛮多篇了。而且当时也没有按顺序写~现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。 顺序整理 1~50 1...

    leo108 评论0 收藏0
  • [leetcode]Longest Valid Parentheses

    摘要:在问题中,我们可以用来检验括号对,也可以通过来检验。遇到就加一,遇到就减一。找到一对括号就在最终结果上加。我们用来表示当前位置的最长括号。括号之间的关系有两种,包含和相离。 Longest Valid Parentheses Given a string containing just the characters ( and ), find the length of the lon...

    qujian 评论0 收藏0
  • LeetCode[22] Generate Parentheses

    摘要:复杂度思路注意的地方,要限制左括号和右括号。每出现一次左括号,就相对于限定了,最多只能出现那么多右括号。所以,为了完成这种限定,用来控制。不然会有的情况出现。 LeetCode[22] Generate Parentheses Given n pairs of parentheses, write a function to generate all combinations of ...

    Jonathan Shieber 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<