301. Remove Invalid Parentheses
很强的一道题!
核心点:
1.右括号多了? 怎么删除能够避免重复?比如())怎么避免删除的重复。s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1]) 此条件就能紧紧的限制住! s要删除的时候,必须得是右括号,要不就是第一个右括号,要不前面不能是右括号。
2.index 保留,s扫的最后的地方.
3.左括号多了怎么办?
- 答案是:从右到左做同样的事情。
- 一个更聪明的想法是:反转字符串并重用代码! 我服~ 大写的服
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;
}