301. Remove Invalid Parentheses
一、题目
1、审题
2、分析
给出一个包含 '('、')' 的字符串,去除最少的字符,使得左右括号能正确闭合。求出所有的正确闭合的字符串。
二、解答
1、思路
①、从左向右扫描,判断是否有多余的 ')',若在 i 位置时有 ')' 多余,则从头开始扫描,若有 ')' 出现,且其前面一个字符不是 ')' 则吧这个字符去除。
②、通过步骤 ① 可以去除多余的 ')'。
②、 将字符串翻转,判断 是否有多余的 '(';
public List<String> removeInvalidParentheses(String s) { List<String> ans = new ArrayList<String>(); remove(s, ans, 0, 0, new char[]{'(', ')'}); return ans; } // last_i 之前的都已匹配; last_j: 从 last_j 开始去除一个多余的 ")" private void remove(String s, List<String> ans, int last_i, int last_j, char[] par) { // i < s.length(); for (int stack = 0, i = last_i; i < s.length(); i++) { char ch = s.charAt(i); if(ch == par[0]) stack++; else if(ch == par[1]) stack--; if(stack >= 0) continue; // stack < 0 for (int j = last_j; j <= i; ++j) //step1: 判断 ")" 是否匹配。 if(s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1])) // 不是连续的 "))" 的情况 remove(s.substring(0, j) + s.substring(j + 1), ans, i, j, par); return; } // 从上一个 for 中跳出来了,不容易啊!从左向右是满足匹配的。 String reversed = new StringBuilder(s).reverse().toString(); if(par[0] == '(') //step2: 在判断 "(" 是否匹配。 remove(reversed, ans, 0, 0, new char[]{')', '('}); else ans.add(reversed); }