很强的一道题!
核心点:
1.右括号多了? 怎么删除可以避免重复?好比())怎么避免删除的重复。s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1]) 此条件就能牢牢的限制住! s要删除的时候,必须得是右括号,要不就是第一个右括号,要不前面不能是右括号。
2.index 保留,s扫的最后的地方.
3.左括号多了怎么办?java
public static void remove(String s, int index, List<String> res, int last_j, char[] par){ for (int stack = 0, i = index; i < s.length(); i ++){ if (s.charAt(i) == par[0]) stack ++; if (s.charAt(i) == par[1]) stack --; if (stack >= 0) continue; for (int j = last_j; j <= i; j ++){ if (s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1]) ){ remove(s.substring(0,j) + s.substring(j+1, s.length()) , index, res, j,par); } } return; } String reversed = new StringBuilder(s).reverse().toString(); if (par[0] == '(') remove(reversed, 0, res, 0, new char[]{')', '('}); else res.add(reversed); } public List<String> removeInvalidParentheses(String s) { List<String> res = new ArrayList<>(); remove(s, 0, res, 0, new char[]{'(',')'}); return res; }