leetcode 301 :删除无效的括号
301. 删除无效的括号
给你一个由若干括号和字母组成的字符串 s
,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
示例 1:
输入:s = "()())()"
输出:["(())()","()()()"]
示例 2:
输入:s = "(a)())()"
输出:["(a())()","(a)()()"]
示例 3:
输入:s = ")("
输出:[""]
提示:
1 <= s.length <= 25
s
由小写英文字母以及括号'('
和')'
组成s
中至多含20
个括号
Related Topics
广度优先搜索
字符串
回溯
官方解答:https://leetcode-cn.com/problems/remove-invalid-parentheses/solution/shan-chu-wu-xiao-de-gua-hao-by-leetcode-9w8au/
回溯
class Solution {
private List<String> res = new ArrayList<String>();
public List<String> removeInvalidParentheses(String s) {
//统计多余的左括号和右括号
int left = 0;
int right = 0;
for(int i = 0 ; i < s.length();i++){
if(s.charAt(i)=='('){
left++;
}else if(s.charAt(i) == ')'){
if(left > 0){
left--;
}else{
right++;
}
}
}
helper(s,0,left,right);
return res;
}
private void helper(String str, int start, int lremove, int rremove) {
//如果已经删除完毕 判断是否符合
if(lremove == 0 && rremove == 0){
if(isValid(str)){
res.add(str);
}
return;
}
for(int i = start; i < str.length();i++){
//连续相同的括号 只需要搜索一次即可
//例 (((()) 去掉前4个任意一个生成的字符串一样 (())))同理 所以在下面只处理第一个
if(i!= start && str.charAt(i)== str.charAt(i-1)){
continue;
}
//长度小于需要移除的字符个数
if(lremove + rremove > str.length() - i){
return;
}
//尝试去掉一个左括号
if(lremove > 0 && str.charAt(i) == '('){
helper(str.substring(0,i)+str.substring(i+1),i,lremove-1,rremove);
}
if(rremove > 0 && str.charAt(i) == ')'){
helper(str.substring(0,i)+str.substring(i+1),i,lremove,rremove-1);
}
}
}
private boolean isValid(String str) {
int count = 0;
for(int i = 0 ; i < str.length();i++){
if(str.charAt(i) == '('){
count++;
}else if(str.charAt(i)==')'){
count--;
if(count < 0){
return false;
}
}
}
return count == 0;
}
}
解答成功:
执行耗时:3 ms,击败了93.63% 的Java用户
内存消耗:41.3 MB,击败了47.09% 的Java用户