链接: https://leetcode-cn.com/problems/remove-invalid-parentheses/
题面
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。
解法
由于数据量不大,字符串最大长度只有25
所以考虑搜索解决
对于每个字符串,要判断它是否是合法的括号字符串,需要满足
- 左括号的数量等于右括号的数量
- 从左往右遍历的过程中,不能出现右括号多于左括号的情况
进行DFS,对于每一位取或者不取,遇到左括号score加1,遇到右括号score减1
如果遇到score小于说明当前子串不合法
将所有的合法的结果塞入一个set进行去重 得到最后的结果
这样属于暴力解法,你可以打败5%的用户
考虑剪枝
由于左括号和右括号的数目都是确定的
所以可以进行预处理,处理出最多的左括号和右括号的数量作为max_score
如果在过程中发现分数超过这个max_score,则说明必然不存在足够多的右括号数使得score变为0
通过这一方式进行剪枝
代码如下
进一步剪枝
考虑到其实在从左往右检索的过程中
通过计算score其实已经可以得出最长的合法字符串长度
也可以知道通过预处理
计算出需要删去的左括号数量和右括号数量
通过在递归检索的过程中判断这一条件 来进行进一步的剪枝优化
代码
剪枝1
1 | class Solution { |
剪枝2
1 | class Solution { |