301. Remove Invalid Parentheses

很強的一道題!
核心點:
1.右括號多了? 怎麼刪除可以避免重複?好比())怎麼避免刪除的重複。s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1]) 此條件就能牢牢的限制住! s要刪除的時候,必須得是右括號,要不就是第一個右括號,要不前面不能是右括號。
2.index 保留,s掃的最後的地方.
3.左括號多了怎麼辦?java

  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;
    }
相關文章
相關標籤/搜索