1. 题目
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。
说明: 输入可能包含了除 (
和 )
以外的字符。
示例 1:
输入: "()())()"
输出: ["()()()", "(())()"]
示例 2:
输入: "(a)())()"
输出: ["(a)()()", "(a())()"]
示例 3:
输入: ")("
输出: [""]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-invalid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 直接回溯,注意剪枝
class Solution {
unordered_set<string> ans;//去重
int mindel = INT_MAX;
public:
vector<string> removeInvalidParentheses(string s) {
int l = 0, r = 0, del = 0;
string t;
dfs(s,0,t,l,r,del);
return vector<string>(ans.begin(), ans.end());
}
void dfs(string& s, int idx, string t, int l, int r, int del)
{
if(del > mindel)//删的多了,没意义了
return;
if(idx == s.size())
{
if(l==r && del < mindel)//左右括号数量要一样多
{
mindel = del;
ans.clear();
ans.insert(t);
}
else if(l==r && del == mindel)
ans.insert(t);
return;
}
if(s[idx]!='(' && s[idx]!=')')//不是括号,加上,跳过
return dfs(s, idx+1, t+s[idx], l, r, del);
if(s[idx]=='(') l++;
else if(s[idx] == ')') r++;
if(l >= r)//左括号在过程中一直>=右括号
dfs(s, idx+1, t+s[idx], l, r, del);//不删除
if(s[idx]=='(') l--;//回溯
else if(s[idx] == ')') r--;//回溯
if(l >= r)
dfs(s, idx+1,t, l, r, del+1);//删除
}
};
152 ms 22 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!