很強的一道題!
核心點:
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; }