301. 删除无效的括号

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

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

示例 1:

输入: “()())()”

输出: ["()()()", “(())()”]

示例 2:

输入: “(a)())()”

输出: ["(a)()()", “(a())()”]

示例 3:

输入: “)(”

输出: [""]

class Solution {
public List<String> removeInvalidParentheses(String s) {
int left = 0, right = 0;
char[] cs = s.toCharArray();
for(char c : cs) {
if(c == '(') {
left++;
}else if(c == ')') {
if(left == 0) right++;
else left--;
}
}
List<String> res = new ArrayList<>();
backtrace(cs, 0, new StringBuilder(s.length()-left-right), res, 0, 0, left, right);
return res;
} private void backtrace(char[] cs, int cur, StringBuilder sb, List<String> res,
int left, int right, int remL, int remR) {
if(cur == cs.length) {
if(remL == 0 && remR == 0) res.add(sb.toString());
return;
}
if(right > left) return;
final int len = sb.length();
if(cs[cur] == '(') {
// use
sb.append('(');
backtrace(cs, cur+1, sb, res, left+1, right, remL, remR);
sb.setLength(len);
if(remL > 0) { // not use
while(cur < cs.length && cs[cur] == '(') { // find next
cur++;
remL--;
}
if(remL >= 0) backtrace(cs, cur, sb, res, left, right, remL, remR);
}
}else if(cs[cur] == ')') {
// use
sb.append(')');
backtrace(cs, cur+1, sb, res, left, right+1, remL, remR);
sb.setLength(len);
if(remR > 0) { // not use
while(cur < cs.length && cs[cur] == ')') { // find next
cur++;
remR--;
}
if(remR >= 0) backtrace(cs, cur, sb, res, left, right, remL, remR);
}
}else {
sb.append(cs[cur]);
backtrace(cs, cur+1, sb, res, left, right, remL, remR);
sb.setLength(len);
}
}
}

最新文章

  1. Java之多线程开发时多条件Condition接口的使用
  2. python property详解
  3. Bzoj3663/4660 CrazyRabbit
  4. 浏览器兼容性之JavaScript篇
  5. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题
  6. 扩展Date的DateDiff方法--日期差
  7. ExtJS4.2.1自定义主题(theme)样式详解
  8. 页面性能测试&amp;提升方式
  9. Linux流量监控工具 - iftop (最全面的iftop教程)
  10. uva315(求割点数目)
  11. HDU 3265 Posters ——(线段树+扫描线)
  12. 如何通过Git将写好的项目发布到github上
  13. navicat premium 破解版
  14. //生成四位数的验证码---&gt;
  15. Sql Server用户名和登录名的关系总结
  16. Mabatis中#{}和${}的区别
  17. Android studio jni
  18. PyQt5编程:鼠标事件
  19. if函数判断日期在某个时间段
  20. 如何实现一个IOS网络监控组件

热门文章

  1. Linux 内核工作队列之work_struct 学习总结
  2. mongodb windows 集群搭建
  3. 业务系统请求zabbix图表性能调优
  4. activiti工作流入门学习
  5. linux-Curl error (37): Couldn&#39;t read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64 [Couldn&#39;t open file /e tc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64]
  6. Date工具遇到的一个坑
  7. linux下获取软件源码包 centos/redhat, debian/ubuntu
  8. Java创建线程的方式
  9. P1880 [NOI1995]石子合并 区间dp
  10. flask之Flask特殊装饰器