[抄题]:

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. oracle之 RAC Interconnect之HAIP

    0. 背景 Oracle 从11.2.0.2开始引入了一个新特性叫做Redundant Interconnect,简称HAIP.HAIP的目的用来代替操作系统级别的网卡绑定以实现Active-Acti ...

  2. Android screencap截屏指令

    查看帮助(注意:有的网友错误使用 screencap -v ,结果差不多,因为系统不能识别-v,就自动打印出帮助信息) # screencap -hscreencap -husage: screenc ...

  3. CSS 属性单词

    .container {padding:0px; height:90%; width:100%; margin:0;}#header {height:0px; width:100%; padding: ...

  4. Tool:Visual Studio

    ylbtech-Tool:Visual Studio Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品.VS是一个基本完整的开发工具集,它包括了整个软件生命 ...

  5. thinkphp 3.2.3 计划任务具体实现实例教程

    thinkphp 3.2.3 计划任务具体实现实例教程 很多情况下,我们网站都会用到计划任务即定时更新做一些处理,类似Discuz后台的计划任务,比如更新每日发帖数目等等! 这里TP也是可以实现的,首 ...

  6. Tomcat的文件列表服务

    今天需要将分析后的日志结果发布到网站上供其他人浏览,虽然用户可以通过直接使用url链接可以访问到对应的文件,但是毕竟还是不方便,没有一个类似文件浏览器的东西,可以直接查看文件夹和文件列表. 其实这样的 ...

  7. (转) docker跨主机 macvlan 网络配置

    原文链接 https://github.com/alfredhuang211/study-docker-doc/blob/master/docker%E8%B7%A8%E4%B8%BB%E6%9C%B ...

  8. python学习(二十五) 链表方法

    # 链表 cars = ['a', "b"] print(cars) # 链表长度 print(len(cars)) # 结尾添加元素 cars.append("c&qu ...

  9. canvas之旋转一条线段

    <canvas id="canvas" width="600" height="500" style="background ...

  10. MySql——触发器

    触发器 什么叫触发器: 就是mysql中的一种“一触即发”的机器(机制). 其实只是预先定义好的一段代码.该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行. 通常就这几个情形: 对某个数据 ...