301.删除无效括号

  • 题目:301.删除无效括号
    • 给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
    • 返回所有可能的结果。答案可以按 任意顺序 返回。
  • 有效括号的情况: 有效 有效 or(有效)
  • 思路:先检查 ) 错误的情况,再检查( 错误的情况
  • 检查:从j【一开始为0】位置开始遍历遇到( 则++,遇到 )就–。如果cont<0则i位置出错
  • 消除错误:遍历[i,j],遇到右括号&&该位的前一个位置不为右括号=》删除该右括号。令i到当前位置。再调remove(i,j)
  • 最后再反转数组(其实是反转左右括号的翻译)
  • 代码

    ```java
    	  package class09;
    	  
    	  import java.util.ArrayList;
    	  import java.util.List;
    	  
    	  // 测试链接 : https://leetcode.com/problems/remove-invalid-parentheses/
    	  public class Code02_RemoveInvalidParentheses {
    	  
    	  	// 来自leetcode投票第一的答案,实现非常好,我们来赏析一下
    	  	public static List<String> removeInvalidParentheses(String s) {
    	  		List<String> ans = new ArrayList<>();
    	  		remove(s, ans, 0, 0, new char[] { '(', ')' });
    	  		return ans;
    	  	}
    	  
    	  	// modifyIndex <= checkIndex
    	  	// 只查s[checkIndex....]的部分,因为之前的一定已经调整对了
    	  	// 但是之前的部分是怎么调整对的,调整到了哪?就是modifyIndex
    	  	// 比如:
    	  	// ( ( ) ( ) ) ) ...
    	  	// 0 1 2 3 4 5 6
    	  	// 一开始当然checkIndex = 0,modifyIndex = 0
    	  	// 当查到6的时候,发现不对了,
    	  	// 然后可以去掉2位置、4位置的 ),都可以
    	  	// 如果去掉2位置的 ), 那么下一步就是
    	  	// ( ( ( ) ) ) ...
    	  	// 0 1 2 3 4 5 6
    	  	// checkIndex = 6 ,modifyIndex = 2
    	  	// 如果去掉4位置的 ), 那么下一步就是
    	  	// ( ( ) ( ) ) ...
    	  	// 0 1 2 3 4 5 6
    	  	// checkIndex = 6 ,modifyIndex = 4
    	  	// 也就是说,
    	  	// checkIndex和modifyIndex,分别表示查的开始 和 调的开始,之前的都不用管了  par  (  )
    	  	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);
    	  		}
    	  	}
    	  
    	  }
    	  
    ```
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值