301. Remove Invalid Parentheses

 

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 ).

Example 1:

Input: "()())()"
Output: ["()()()", "(())()"]

Example 2:

Input: "(a)())()"
Output: ["(a)()()", "(a())()"]

Example 3:

Input: ")("
Output: [""]

要点:1 、第一轮先检查右括号的有效性,第二轮检查左括号的有效性,经过两轮检查后才得到有效的值

           2、每一次只需要上次未遍历的地方开始遍历

           3、last_remove记录上次删除的索引,只会从last_remove向后删除,以防止得到重复字符串,否则可能会出现下面的例子中删掉位置1,3和删掉位置3,1这种只是删除时间不同,但是结果相同的情况

          4、因为可能存在以下例子中位置3,4相同‘)’的情况,故只对连续相同的中的第一个进行处理,以免得到重复字符串

            

           01234567

           ( )( ) ) ( ) )

class Solution {
    public List<String> removeInvalidParentheses(String s) {
       
        List<String> res = new ArrayList<>();
        if(s==null) return res;
        remove(res,s,0,0,new char[]{'(',')'});
        return res;
        
    }
    public void remove(List<String> res,String s,int last_index,int last_remove,char[] par){
        int count = 0;
        for(int i=last_index;i<s.length();i++){
            if(s.charAt(i)==par[0]) count++;
            if(s.charAt(i)==par[1]) count--;
            if(count>=0) continue;
            for(int j=last_remove;j<=i;j++){
                if(s.charAt(j)==par[1]&&(j==last_remove || s.charAt(j-1)!=s.charAt(j))){
                    remove(res,s.substring(0,j)+s.substring(j+1,s.length()),i,j,par);
                }
            }
            return;//当程序执行到这里,证明s在一侧具有无效括号,并且在以上步骤中去除并继续执行下去,而此循环已经没有执行的必要,并且以下程序也没有资格执行下去,故用return
        }
        String reverseStr = new StringBuilder(s).reverse().toString();
        if(par[1]==')'){
            remove(res,reverseStr,0,0,new char[]{')','('});
        }
        else
            res.add(reverseStr);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值