301.删除无效的括号
题目
给你一个由若干括号和字母组成的字符串 s
,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
括号匹配
定义l,r两个int变量作为记录左括号和右括号不匹配个数,遍历string s,当遇到左括号时l直接++;遇到右括号的时候r先++,然后判断一下,如果l>0,则r和l都–,代表这个括号匹配了。最后循环结束,如果r+l==0则说明匹配。
for(auto a:s){
if(a=='('){
l++;
ll++;
}
else if(a==')'){
r++;
rr++;
if(l>0){
l--;
r--;
}
}
}
回溯
探索每种情况,并使用剪枝手段降低时间复杂度(否则会超时)。
string s中的每一位符合的括号都需要分为两支:1.加上这一个括号;2.不要这一个括号
采用回溯的方法,遍历每种情况。遍历结束时需要判断,最终得到的目标string需要进一步判断是否时有效的括号。如果是,则加入到vector中。
剪枝
我使用的剪枝交简单,只是读取string s的左右括号的总数,在回溯中每处理一个括号,就将计数-1,如果此时括号的剩余数量小于需要去掉的数量,则这一分支就不用再继续下去了,直接return;