题目

题解

  • step1. 遍历一遍,维护left、right计数器,分别记录不合法的左括号、右括号数量.

    • 判断不合法的方法?

      • left维护未匹配左括号数量(增,减)(当left为0遇到右括号,则交由right处理),最终剩余的左括号数量就是不合法的左括号数量
      • 遇右括号时,若左侧的左括号都已被匹配(left==0),则此右括号为不合法右括号,right++
      • PS 对于题目中最少:此方法判断出的所有不合法括号,就是所谓的最少不合法括号数量;在此基础上得到的合理表达式,删除成对的括号,也会是合法表达式。
      • PS 为什么不同于判断合法括号的题目,只使用一个left计数器? 因为要对不合法的左括号和右括号分别记录数量.
  • step2.利用dfs不断删除"("或者")",直到不合法个数为0。参照相关中的步骤:

    1. dfs参数有:当前删除已删除括号后的字符串,待处理位置,剩余不合法左括号数l,剩余右括号不合法数r;
    2. 特别判断:去重:若当前字符和之前字符相同,则continue;
    3. 返回条件:l0&&r0,且当前字符串括号合法
    4. 删除当前括号,进入下一层搜索
  • step3.检验删除后的括号串是否合法。

    使用left计数器判断即可。

  • 注意: 当前还有不合法左(右)括号且当前括号为左(右)括号,才能进入下一层搜索。

  • 注意:下一层搜索的第一个参数

相关

判断括号有效:

  • 法1 (单一种类括号):维护left计数器
  • 法2 (多种类括号):使用栈

dfs关键:

  1. dfs参数
  2. 一些特别的剪枝条件,根据情况选择直接返回或者continue
  3. dfs返回条件并返回,同时可能需要记录一些需要的结果
  4. 进入下层搜索的条件

String:

str1.subString(beg,end); //拷贝
str2.subStr(beg,len); //拷贝

代码

class Solution {
private List<String> validStrList; public List<String> removeInvalidParentheses(String s) {
// 得到不合法左括号数和右括号数
int lCnt = 0;
int rCnt = 0;
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == '(') {
lCnt++;
} else if (s.charAt(i) == ')') {
if (lCnt > 0) {
lCnt--;
} else {
rCnt++;
}
}
} validStrList = new ArrayList<>();
dfs(s, 0, lCnt, rCnt);
return validStrList;
} private void dfs(String s, int pos, int lCnt, int rCnt) {
if (lCnt == 0 && rCnt == 0) {
if (validStr(s)) {
validStrList.add(s);
}
return;
}
for (int i = pos; i < s.length(); ++i) {
if (i != pos && s.charAt(i) == s.charAt(i - 1)) {
continue;
}
if (lCnt > 0 && s.charAt(i) == '(') {//
dfs(s.substring(0, i) + s.substring(i + 1), i, lCnt - 1, rCnt);//
}
if (rCnt > 0 && s.charAt(i) == ')') {//
dfs(s.substring(0, i) + s.substring(i + 1), i, lCnt, rCnt - 1);//
}
}
} private boolean validStr(String s) {
int left = 0;
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == '(') {
left++;
} else if (s.charAt(i) == ')') {
if (left <= 0) {
return false;
}
left--;
}
}
return left == 0;
}
}

[LeetCode]301. 删除无效的括号(DFS)的更多相关文章

  1. Java实现 LeetCode 301 删除无效的括号

    301. 删除无效的括号 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明: 输入可能包含了除 ( 和 ) 以外的字符. 示例 1: 输入: "()())()&quo ...

  2. Leetcode 301.删除无效的括号

    删除无效的括号 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明: 输入可能包含了除 ( 和 ) 以外的字符. 示例 1: 输入: "()())()" 输出 ...

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

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

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

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

  5. [Swift]LeetCode301. 删除无效的括号 | Remove Invalid Parentheses

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

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

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

  7. [LeetCode] 20. Valid Parentheses 合法括号

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  8. 每日一道 LeetCode (6):有效的括号

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  9. word中几个好用的宏代码(立方米上标、关闭样式自动更新、删除无效样式、表格加粗边框、宋体引号)

    Sub 替换立方米() With Selection.Find .Text = "m3" .Replacement.Text = "mm3" .Forward ...

随机推荐

  1. 设计模式:原型模式介绍 && 原型模式的深拷贝问题

    0.背景 克隆羊问题:有一个羊,是一个类,有对应的属性,要求创建完全一样的10只羊出来. 那么实现起来很简单,我们先写出羊的类: public class Sheep { private String ...

  2. python设计模式之代理模

    python设计模式之代理模式 在某些应用中,我们想要在访问某个对象之前执行一个或多个重要的操作,例如,访问敏感信息--在允许用户访问敏感信息之前,我们希望确保用户具备足够的权限.操作系统中也存在类似 ...

  3. VS2005 如何打开VS2008的工程 2009-06-24 20:22

    大家都碰到过用2005打开2008的工程吧.2008打开2005是没有问题,但是反过来呢,却不可以.当用2005打开2008时,看着工具提示要进行工程转换心里高兴吧,当转换后发现工程无法加载是不是很居 ...

  4. 非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串

    非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串 题目描述 \(JYY\)有两个长度均为\(N\)的字符串\(A\)和\(B\). 一个"扭动字符串\(S(i,j,k)\)由\( ...

  5. 大整数加法C++(计蒜客)

    求两个不超过 200200 位的非负整数的和. 输入格式 有两行,每行是一个不超过 200200 位的非负整数,可能有多余的前导 00. 输出格式 一行,即相加后的结果.结果里不能有多余的前导 00, ...

  6. JavaScript学习系列博客_29_JavaScript arguments

    arguments (封装实参的对象) 在调用函数时,浏览器每次都会传递进两个隐含的参数:1.函数的上下文对象 this2.封装实参的对象 arguments- arguments是一个类数组对象,它 ...

  7. 详解Python中的__init__和__new__

    转载:https://my.oschina.net/liuyuantao/blog/747164 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ ...

  8. Ceph的Python接口

    参考文章 ceph的python_api文档: http://docs.ceph.com/docs/master/rados/api/python/ 连接ceph集群 import rados clu ...

  9. CocosCreator游戏开发(四)实现摇杆控制角色功能

    时隔3年,我又开始继续写这个系列的帖子了,也不知道是会写完全系列,还是再次夭折. 废话不多.直接开始主题了 主要实现的功能点包含这些内容:通过摇杆控制角色进行八方位移动,并按照各方位播放对应移动动画 ...

  10. HYSBZ-1045 糖果传递

    有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 假设当所有人获得均等的糖果的时候: 每个人手上的糖果的数量为\(ave\) 第\(i\)个人初始时的 ...