望着时间滴答滴答的流过,我不曾改变过 . . .

301. Remove Invalid Parentheses

很强的一道题!
核心点:
1.右括号多了? 怎么删除能够避免重复?比如())怎么避免删除的重复。s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1]) 此条件就能紧紧的限制住! s要删除的时候,必须得是右括号,要不就是第一个右括号,要不前面不能是右括号。
2.index 保留,s扫的最后的地方.
3.左括号多了怎么办?

  1. 答案是:从右到左做同样的事情。
  2. 一个更聪明的想法是:反转字符串并重用代码! 我服~ 大写的服
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;
    }
posted @ 2019-04-17 12:06  whyaza  阅读(139)  评论(0编辑  收藏  举报