- 题目: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); } } } ```
301.删除无效括号
最新推荐文章于 2024-07-20 22:34:59 发布