JAVA程序设计:删除无效的括号(LeetCode:301)

删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。

说明: 输入可能包含了除 ( 和 ) 以外的字符。

示例 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);
    	
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值