leetcode打卡--301. 删除无效的括号(预处理的暴力枚举)
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode打卡--301. 删除无效的括号(预处理的暴力枚举)相关的知识,希望对你有一定的参考价值。
题目
解题思路
这题就是考察普通的暴力枚举得出答案。但问题是如何暴力枚举才能得出答案?
我们经过以下步骤便可完成解题:
- 预处理得出需要删除的左括号和右括号个数。
- 用dfs或者bfs进行每一步的删除枚举。(注意可以进行剪枝–每次如果出现相邻的相同字符,删除哪个得到的字符串都是一样的,所以可以continue)
解题代码
C++解决
class Solution {
public:
vector<string>res;
//最开始的l,r表示我们需要删除多少左括号和右括号才能得到正确的表达式
//可以用bfs进行每一次的删除,也可以用dfs进行
//dfs暴力枚举解决:每一次dfs表示选择一个位置的字符进行删除,然后进行下一次选择!
//每一层dfs提供的选择就是字符串的长度,而每一次删除一个字符时,如果出现连续相同的字符,则删除得到的字符是等价的,所以需要把这种情况剪枝!
void dfs(string& sb,int l,int r,int start){
if(l==0&&r==0){
if(isValid(sb)){
res.push_back(sb);
}
return ;
}
int n = sb.size();
for(int pos=start;pos<n;pos++){
if(pos>0&&sb[pos]==sb[pos-1])
continue;
if(sb[pos]=='('&&l>0){
string t = sb.substr(0,pos) +
sb.substr(pos+1,n-pos-1);
dfs(t,l-1,r,pos);
}else if(sb[pos]==')'&&r>0){
string t = sb.substr(0,pos)+
sb.substr(pos+1,n-pos-1);
dfs(t,l,r-1,pos);
}
}
}
bool isValid(string& s){
int cnt = 0;
for(auto&& t:s){
if(t=='(')
cnt++;
if(t==')'){
if(cnt>0)
cnt--;
else
return false;
}
}
return cnt == 0;
}
vector<string> removeInvalidParentheses(string s) {
int l=0,r=0,sz = s.size();//l和r代表多出来的左括号和右括号数目
for(int i=0;i<sz;i++){
if(s[i]=='('){
l++;
}else if(s[i]==')'){
if(l>0)
l--;
else
r++;
}
}
dfs(s,l,r,0);
return res;
}
};
Go语言解决
func removeInvalidParentheses(s string) []string {
l,r:=0,0
res:=[]string{}
for _,v:=range s{
if v=='('{
l++
}else if v==')'{
if l==0{
r++
}else{
l--
}
}
}
dfs(s,0,l,r,&res)
return res
}
func dfs(s string,start,l,r int,res *[]string){
if l==0 && r==0{
if isValid(s){
*res = append(*res, s)
}
return
}
for i:=start;i<len(s);i++{
if i!=start && s[i]==s[i-1]{
continue
}
if s[i]==')' && r>0{
cur:=s
cur = cur[:i]+cur[i+1:]
dfs(cur,i,l,r-1,res)
}else if s[i]=='(' && l>0{
cur:=s
cur = cur[:i]+cur[i+1:]
dfs(cur,i,l-1,r,res)
}
}
}
func isValid(s string) bool{
cnt:=0
for _,v:=range s{
if v=='('{
cnt++
}
if v==')'{
cnt--
}
if cnt<0{
return false
}
}
return cnt ==0
}
以上是关于leetcode打卡--301. 删除无效的括号(预处理的暴力枚举)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 301 删除无效的括号[dfs 字符串] HERODING的LeetCode之路