[抄题]:

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.

Note: The input string may contain letters other than the parentheses ( and ).

Example 1:

Input: "()())()"
Output: ["()()()", "(())()"]

Example 2:

Input: "(a)())()"
Output: ["(a)()()", "(a())()"]

Example 3:

Input: ")("
Output: [""]

[暴力解法]:

时间分析:

空间分析:

[优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

[思维问题]:

一看“匹配”就以为要用stack:果然很麻烦

用bfs: 随着index i 的增加,括号元素可以加也可以不加 在sb.append中体现,所以用dfs

[英文数据结构或算法,为什么不用别的数据结构或算法]:

hashset:dfs是随机的 可能出现重复现象,所以用来给结果去重

dfs的格式:

dfs(起点变量,终点变量,过程变量)

[一句话思路]:

为了去除的括号数量最少,只要左右相等就可以 所以用L R来控制dfs递增的次数

只能右消左(),不能左消右)(。因为是反的。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 主函数中调用R L要带入字母,不是0
  2. DFS中不需要写for,每次只对一个变量进行处理

[二刷]:

  1. i == length必定会退出,指标为0才添加到答案中
  1. 刚新建就被返回了,此时可以return 二合一

[三刷]:

  1. DFS的顺序是左括号先不用,再用 先按照初始值来。虽然不知道为什么。

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

选择括号要不要可以用DFS

[复杂度]:Time complexity: O(2^n) Space complexity: O(n)

[算法思想:递归/分治/贪心]:递归

[关键模板化代码]:

[其他解法]:

BFS可是慢啊

[Follow Up]:

[LC给出的题目变变变]:

[代码风格] :

class Solution {
public List<String> removeInvalidParentheses(String s) {
//ini: count L, R. Set, List<String>
int L = 0, R = 0, n = s.length();
Set<String> set = new HashSet<>();
for (int i = 0; i < n; i++) {
if (s.charAt(i) == '(') L++;
else if (s.charAt(i) == ')') {
if (L > 0) L--;
else R++;
}
} System.out.println("L =" + L);
System.out.println("R =" + R); //dfs
dfs(s, 0, set, new StringBuilder(), L, R, 0); //return res
return new ArrayList<String>(set);
} public void dfs(String s, int i, Set<String> set, StringBuilder sb, int L, int R, int open) {
//cc: exit
if (L < 0 || R < 0 || open < 0) return ; //normal return
if (i == s.length()) {
if (L == 0 && R == 0 && open == 0) set.add(sb.toString());
return ;
} //getlen of sb
int len = sb.length();
char c = s.charAt(i); if (c == '(') {
//not use (
dfs(s, i + 1, set, sb, L - 1, R, open);
//use (
dfs(s, i + 1, set, sb.append(c), L, R, open + 1);
}else if (c == ')') {
//not use )
dfs(s, i + 1, set, sb, L, R - 1, open);
//use )
dfs(s, i + 1, set, sb.append(c), L, R, open - 1);
}else {
dfs(s, i + 1, set, sb.append(c), L, R, open);
}
//set len for sb
sb.setLength(len); } }

[是否头一次写此类driver funcion的代码] :

最新文章

  1. javascript生成二维码
  2. Swift 必备开发库 (高级篇)
  3. [Design Patterns] 2. Design principle
  4. MySQL关于InnoDB的几个错误
  5. IIS 分析器错误消息: 未能加载类型“_Default”
  6. Access restriction:The type JPEGCodec is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar
  7. EnumMap demo
  8. OC-之AFNetworking与ASIHTTPRequest对比
  9. 手机QQ无法临时会话的解决方案
  10. 洛谷 [P3254] 圆桌问题
  11. [SDOI2009]HH去散步
  12. 《JavaScript高级程序设计》笔记:客户端检测(九)
  13. Centos 7 最小化kvm部署
  14. C# 使用MongoDB遇到的问题
  15. C++ lstrlen()
  16. Javascript中的闭包和C#中的闭包
  17. [Bayes] Understanding Bayes: Visualization of the Bayes Factor
  18. [Go] 子类 调用 父类 的 属性、方法
  19. [日常] Linux使用diff来比较目录
  20. 洛谷P1420 最长连号 题解

热门文章

  1. 关于php user ini 文件的配置笔记 (TODO)
  2. ffmpeg/ffplay 添加实时的时间水印 (转)
  3. Appium ios新的定位方式FindsByIosNSPredicate (没有试 先记录在这里) 有个 driver.find_element_by_ios_uiautomation() 研究下 ios的定位
  4. Java运算符 逻辑运算符 短路运算符
  5. 怎样优化CPU
  6. Vim编辑器基本操作学习(一)
  7. php 数组去重 (一维数组与二维数组)
  8. jQuery中this与$(this)的区别实例
  9. 学生党成功拿到阿里技术offer:面Java开发,却是C++考官,几个意思?
  10. PyQt5+python+pycharm开发环境配置