1、題目ui
一、審題 spa
二、分析code
給出一個包含 '('、')' 的字符串,去除最少的字符,使得左右括號能正確閉合。求出全部的正確閉合的字符串。blog
2、解答ci
一、思路leetcode
①、從左向右掃描,判斷是否有多餘的 ')',若在 i 位置時有 ')' 多餘,則從頭開始掃描,如有 ')' 出現,且其前面一個字符不是 ')' 則吧這個字符去除。字符串
②、經過步驟 ① 能夠去除多餘的 ')'。get
②、 將字符串翻轉,判斷 是否有多餘的 '(';string
public List<String> removeInvalidParentheses(String s) { List<String> ans = new ArrayList<String>(); remove(s, ans, 0, 0, new char[]{'(', ')'}); return ans; } // last_i 以前的都已匹配; last_j: 從 last_j 開始去除一個多餘的 ")" private void remove(String s, List<String> ans, int last_i, int last_j, char[] par) { // i < s.length(); for (int stack = 0, i = last_i; i < s.length(); i++) { char ch = s.charAt(i); if(ch == par[0]) stack++; else if(ch == par[1]) stack--; if(stack >= 0) continue; // stack < 0 for (int j = last_j; j <= i; ++j) //step1: 判斷 ")" 是否匹配。 if(s.charAt(j) == par[1] && (j == last_j || s.charAt(j - 1) != par[1])) // 不是連續的 "))" 的狀況 remove(s.substring(0, j) + s.substring(j + 1), ans, i, j, par); return; } // 從上一個 for 中跳出來了,不容易啊!從左向右是知足匹配的。 String reversed = new StringBuilder(s).reverse().toString(); if(par[0] == '(') //step2: 在判斷 "(" 是否匹配。 remove(reversed, ans, 0, 0, new char[]{')', '('}); else ans.add(reversed); }