[LeetCode]301. 删除无效的括号(DFS)
题目
题解
step1. 遍历一遍,维护left、right计数器,分别记录不合法的左括号、右括号数量.
- 判断不合法的方法?
- left维护未匹配左括号数量(增,减)(当left为0遇到右括号,则交由right处理),最终剩余的左括号数量就是不合法的左括号数量
- 遇右括号时,若左侧的左括号都已被匹配(left==0),则此右括号为不合法右括号,right++
- PS 对于题目中最少:此方法判断出的所有不合法括号,就是所谓的最少不合法括号数量;在此基础上得到的合理表达式,删除成对的括号,也会是合法表达式。
- PS 为什么不同于判断合法括号的题目,只使用一个left计数器? 因为要对不合法的左括号和右括号分别记录数量.
- 判断不合法的方法?
step2.利用dfs不断删除"("或者")",直到不合法个数为0。参照相关中的步骤:
- dfs参数有:当前删除已删除括号后的字符串,待处理位置,剩余不合法左括号数l,剩余右括号不合法数r;
- 特别判断:去重:若当前字符和之前字符相同,则continue;
- 返回条件:l0&&r0,且当前字符串括号合法。
- 删除当前括号,进入下一层搜索
step3.检验删除后的括号串是否合法。
使用left计数器判断即可。注意: 当前还有不合法左(右)括号且当前括号为左(右)括号,才能进入下一层搜索。
注意:下一层搜索的第一个参数
相关
判断括号有效:
- 法1 (单一种类括号):维护left计数器
- 法2 (多种类括号):使用栈
dfs关键:
- dfs参数
- 一些特别的剪枝条件,根据情况选择直接返回或者continue
- dfs返回条件并返回,同时可能需要记录一些需要的结果
- 进入下层搜索的条件
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)的更多相关文章
- Java实现 LeetCode 301 删除无效的括号
301. 删除无效的括号 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明: 输入可能包含了除 ( 和 ) 以外的字符. 示例 1: 输入: "()())()&quo ...
- Leetcode 301.删除无效的括号
删除无效的括号 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明: 输入可能包含了除 ( 和 ) 以外的字符. 示例 1: 输入: "()())()" 输出 ...
- Leetcode之深度优先搜索(DFS)专题-301. 删除无效的括号(Remove Invalid Parentheses)
Leetcode之深度优先搜索(DFS)专题-301. 删除无效的括号(Remove Invalid Parentheses) 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明 ...
- 301 Remove Invalid Parentheses 删除无效的括号
删除最小数目的无效括号,使输入的字符串有效,返回所有可能的结果.注意: 输入可能包含了除 ( 和 ) 以外的元素.示例 :"()())()" -> ["()()() ...
- [Swift]LeetCode301. 删除无效的括号 | Remove Invalid Parentheses
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...
- [LeetCode] 301. Remove Invalid Parentheses 移除非法括号
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...
- [LeetCode] 20. Valid Parentheses 合法括号
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- 每日一道 LeetCode (6):有效的括号
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- word中几个好用的宏代码(立方米上标、关闭样式自动更新、删除无效样式、表格加粗边框、宋体引号)
Sub 替换立方米() With Selection.Find .Text = "m3" .Replacement.Text = "mm3" .Forward ...
随机推荐
- 几个递进的make file
春节在家写的几个递进的make file,部分有点问题.接下来 有空我要把GNU make的手册看完.不然这方面太菜了. GNU make手册 都需要make先设置环境变量BUILD_MODE为run ...
- 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
本文是精讲RestTemplate第9篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...
- JDBC API阐述
JDBC API JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果. Driver 接口 Java.sql.Driver 接口是所有 JDBC 驱动 ...
- 2020.5.26 第六篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...
- 区块链入门到实战(26)之以太坊(Ethereum) – 挖矿
以太坊(Ethereum)与其他公共区块链一样,使用工作量证明机制确保区块链网络正常运行. 矿工进行工作量证明计算,即挖矿,来选择区块,写入区块链,确认交易. 交易过程如下图所示: 从技术角度来看,以 ...
- python连接mysql中报错1064修改方法
Python是编程语言,MySQL是数据库,它们是两种不同的技术:要想使Python操作MySQL数据库需要使用驱动.这里选用PyMySQL驱动.下载地址: https://pypi.python.o ...
- SQL分组排序后取每组最新一条数据的另一种思路
在hibernate框架和mysql.oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据. 之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条 ...
- 90%的开发都没搞懂的CI和CD!
据IDC统计,2017年,DevOps的全球软件市场已达到约39亿美元的水平,预计到2022年市场将达到80亿美元左右! 在敏捷软件开发环境中,工作模型和操作需要对公司不断变化的需求具有超级灵活的能力 ...
- jQuery源码分析系列(三)Sizzle选择器引擎-下
选择函数:select() 看到select()函数,if(match.length === 1){}存在的意义是尽量简化执行步骤,避免compile()函数的调用. 简化操作同样根据tokenize ...
- shazidouhuiapp
在选择了软件工程专业之后,指导教师也让我们参加到了学长学姐的作业之中来,使用学长学姐们的软件并写出自己的使用评价以及自己的一些小评价. 我这次体验的是第三组的学长学姐们的软件,他们的队名叫天公疼憨仔, ...