[抄题]:

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的代码] :

301. Remove Invalid Parentheses去除不符合匹配规则的括号的更多相关文章

  1. [leetcode]301. Remove Invalid Parentheses 去除无效括号

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

  2. [LeetCode] 301. Remove Invalid Parentheses 移除非法括号

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

  3. 301. Remove Invalid Parentheses

    题目: Remove the minimum number of invalid parentheses in order to make the input string valid. Return ...

  4. LeetCode 301. Remove Invalid Parentheses

    原题链接在这里:https://leetcode.com/problems/remove-invalid-parentheses/ 题目: Remove the minimum number of i ...

  5. 301 Remove Invalid Parentheses 删除无效的括号

    删除最小数目的无效括号,使输入的字符串有效,返回所有可能的结果.注意: 输入可能包含了除 ( 和 ) 以外的元素.示例 :"()())()" -> ["()()() ...

  6. 【leetcode】301. Remove Invalid Parentheses

    题目如下: 解题思路:还是这点经验,对于需要输出整个结果集的题目,对性能要求都不会太高.括号问题的解法也很简单,从头开始遍历输入字符串并对左右括号进行计数,其中出现右括号数量大于左括号数量的情况,表示 ...

  7. Leetcode之深度优先搜索(DFS)专题-301. 删除无效的括号(Remove Invalid Parentheses)

    Leetcode之深度优先搜索(DFS)专题-301. 删除无效的括号(Remove Invalid Parentheses) 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明 ...

  8. [LeetCode] Remove Invalid Parentheses 移除非法括号

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

  9. Remove Invalid Parentheses

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

随机推荐

  1. linux中sar的详细使用

    在使用UNIX操作系统的过程中,我们常常会用到各种各样的问题,比如系统运行速度突然变慢,系统容易死机或者主机所带的终端常出现死机,这时我们常常猜测,是硬盘空间太小,还是内存不足?I/O出现瓶颈,或者是 ...

  2. java nio和bio

    理解同步/异步,阻塞/非阻塞:https://juejin.im/entry/598da7d16fb9a03c42431ed3 2:http://qindongliang.iteye.com/blog ...

  3. requireJS的使用说明

    RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代码,但其主要目的还是为了代码的模块化 requireJS 加载代码的 ...

  4. 最近github上的一些有用链接资料备份

    https://github.com/dlunion 这个人写了库里面有caffe简单版本的代码,依赖少的版本,他的caffe可以支持ssd和lstm序列识别等等 还有openPose等库代码 OCR ...

  5. SmtpClient发送邮件

    使用第三方SMTP服务器来发送邮件.如网易: SmtpClient sc = new SmtpClient("smtp.126.com"); sc.Credentials = ne ...

  6. laravel的auth用户认证的例子

    参考http://www.cnblogs.com/yjf512/p/4042356.html 需要注意的是,生成的测试数据,password部分必须用laravel自带的hash一下 Hash::ma ...

  7. 黄聪:如何使用Add-on SDK开发一个自己的火狐扩展

    火狐开放了扩展的开发权限给程序员们,相信很多人都会希望自己做一些扩展来方便一些使用. 我最近做一些项目也需要开发一个火狐扩展,方便收集自己需要的数据,因此研究了几天怎么开发,现在已经差不多完成了,就顺 ...

  8. Excel if函数无法正确对比大小

    我想完成以下操作 1.提取A列数字的第7-11位的数字 2.若此数字大于1993 3.则返回20,不然返回0 于是我在B和C列上写了两个函数,分别是 MID(A1,7,4)          IF(B ...

  9. Java中的 super和this

    super关键字 在子类中用于表示父类对象的引用,可以在子类中调用父类中的方法的属性. super语句 --- 子类在继承父类之后,子类的构造方法中会含有一个super语句. 如果没有手动指定supe ...

  10. OSGi学习-总结

    本文是osgi实战一书的前几章读书总结 1.  OSGi简介 Java缺少对高级模块化的支持,为了弥补Java在模块化方面的不足,大多数管理得当的项目都会要求建立一整套技术,包括: 适应逻辑结构的编程 ...