删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。
说明: 输入可能包含了除 ( 和 ) 以外的字符。
示例 1:
输入: "()())()"
输出: ["()()()", "(())()"]
示例 2:
输入: "(a)())()"
输出: ["(a)()()", "(a())()"]
示例 3:
输入: ")("
输出: [""]
思路:回溯搞一搞啦,剪枝的一点是如果当前是有括号的话,看前边左括号的数量,如果小于右括号的数量的话呢就没必要往下回溯了。
class Solution {
private Set<String> validExpressions=new HashSet<String>();
private int minimumRemoved;
private void reset()
{
this.validExpressions.clear();
this.minimumRemoved=Integer.MAX_VALUE;
}
private void recurse(String s,int index,int leftCount,int rightCount,StringBuilder expression,int removedCount)
{
if(index==s.length())
{
if(leftCount==rightCount)
{
if(removedCount<=this.minimumRemoved)
{
String possibleAnswer=expression.toString();
if(removedCount<this.minimumRemoved)
{
this.validExpressions.clear();
this.minimumRemoved=removedCount;
}
this.validExpressions.add(possibleAnswer);
}
}
}
else
{
char currentCharacter=s.charAt(index);
int length=expression.length();
if(currentCharacter!=')' && currentCharacter!='(')
{
expression.append(currentCharacter);
this.recurse(s, index+1, leftCount, rightCount, expression, removedCount);
expression.deleteCharAt(length);
}
else
{
this.recurse(s, index+1, leftCount, rightCount, expression, removedCount+1);
expression.append(currentCharacter);
if(currentCharacter=='(')
this.recurse(s, index+1, leftCount+1, rightCount, expression, removedCount);
else if(rightCount<leftCount)
this.recurse(s, index+1, leftCount, rightCount+1, expression, removedCount);
expression.deleteCharAt(length);
}
}
}
public List<String> removeInvalidParentheses(String s) {
this.reset();
this.recurse(s, 0, 0, 0, new StringBuilder(), 0);
return new ArrayList(this.validExpressions);
}
}