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); }