Java移除无效括号的方法实现


Posted in Java/Android onAugust 07, 2021

一、题目

给你一个由 ‘('、')' 和小写字母组成的字符串 s。

你需要从字符串中删除最少数目的 ‘(' 或者 ‘)' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。

有效「括号字符串」应当符合以下 任意一条 要求:

空字符串或只包含小写字母的字符串
可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」

二、示例

))((  -》  

(leetode  -》  leetode
leetode)  -》  leetode

(lee(to)de  -》  lee(to)de
lee(to)de)  -》  lee(to)de

(lee(t(c)o)de  -》  lee(t(c)o)de
lee(t(c)o)de)  -》  lee(t(c)o)de

三、解法1

public class Test {

 public static void main(String[] args) {
  String s1 = "))((";
  System.out.println(s1 + "  -》  " + minRemoveToMakeValid(s1));

  String s2 = "(leetode";
  System.out.println(s2 + "  -》  " + minRemoveToMakeValid(s2));

  String s3 = "leetode)";
  System.out.println(s3 + "  -》  " + minRemoveToMakeValid(s3));

  String s4 = "(lee(to)de";
  System.out.println(s4 + "  -》  " + minRemoveToMakeValid(s4));

  String s5 = "lee(to)de)";
  System.out.println(s5 + "  -》  " + minRemoveToMakeValid(s5));

  String s6 = "(lee(t(c)o)de";
  System.out.println(s6 + "  -》  " + minRemoveToMakeValid(s6));

  String s7 = "lee(t(c)o)de)";
  System.out.println(s7 + "  -》  " + minRemoveToMakeValid(s7));
 }

 public static String minRemoveToMakeValid(String str) {
  // 初始化"("和")"的个数为0
  int left = 0;
  int right = 0;

  // 将字符串转换为char数组
  char[] chars = str.toCharArray();

  // 从左到右标记多余的")"右括号
  for (int i = 0; i < chars.length; i++) {
   if (chars[i] == '(') {
    left++;
   } else if (chars[i] == ')') {
    right++;
   }

   if (right > left) {
    chars[i] = '#';

    left = right = 0;
   }
  }

  left = right = 0;

  // 从右到左标记多余的"("左括号
  for (int i = chars.length - 1; i >= 0; i--) {
   if (chars[i] == '(') {
    left++;
   } else if (chars[i] == ')') {
    right++;
   }

   if (right < left) {
    chars[i] = '#';

    left = right = 0;
   }
  }

  return String.valueOf(chars).replaceAll("#", "");
 }
}

四、解法2

Stack.peek 与Sstack.pop 的区别

  • 相同点:大家都返回栈顶的值。
  • 不同点:peek 不改变栈的值(不删除栈顶的值),pop会把栈顶的值删除。
public class Test {

 public static void main(String[] args) {
  String s1 = "))((";
  System.out.println(s1 + "  -》  " + minRemoveToMakeValid(s1));

  String s2 = "(leetode";
  System.out.println(s2 + "  -》  " + minRemoveToMakeValid(s2));

  String s3 = "leetode)";
  System.out.println(s3 + "  -》  " + minRemoveToMakeValid(s3));

  String s4 = "(lee(to)de";
  System.out.println(s4 + "  -》  " + minRemoveToMakeValid(s4));

  String s5 = "lee(to)de)";
  System.out.println(s5 + "  -》  " + minRemoveToMakeValid(s5));

  String s6 = "(lee(t(c)o)de";
  System.out.println(s6 + "  -》  " + minRemoveToMakeValid(s6));

  String s7 = "lee(t(c)o)de)";
  System.out.println(s7 + "  -》  " + minRemoveToMakeValid(s7));
 }

 public static String minRemoveToMakeValid(String str) {
  // 记录要删除括号的下标,然后从后往前删除坐标
  StringBuffer result = new StringBuffer(str);
  
  Stack<Integer> stack = new Stack<>();
  ArrayList<Integer> deleteRes = new ArrayList<>();
  
  for (int i = 0; i < str.length(); i++) {
   if (str.charAt(i) == '(') {
    stack.push(i);
   } else if (str.charAt(i) == ')') {
    if (stack.empty()) {
     deleteRes.add(i);
    } else if (str.charAt(stack.peek()) == '(') {
     stack.pop();
    }
   }
  }
  
  while (!stack.empty()) {
   int temp = stack.peek();
   stack.pop();
   deleteRes.add(0, temp);
  }
  
  deleteRes.sort(Integer::compareTo);
  
  for (int i = deleteRes.size() - 1; i >= 0; i--) {
   result.deleteCharAt(deleteRes.get(i));
  }
  
  return result.toString();
 }
}

到此这篇关于Java移除无效括号的方法实现的文章就介绍到这了,更多相关Java移除无效括号内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
springBoot基于webSocket实现扫码登录
Jun 22 Java/Android
Java实现多文件上传功能
Jun 30 Java/Android
SpringBoot 拦截器妙用你真的了解吗
Jul 01 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
Jul 15 Java/Android
SpringBoot整合阿里云视频点播的过程详解
Dec 06 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
Java异常体系非正常停止和分类
Jun 14 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 Java/Android
简述Java中throw-throws异常抛出
Aug 07 #Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 #Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 #Java/Android
springboot+WebMagic+MyBatis爬虫框架的使用
Aug 07 #Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 #Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 #Java/Android
mybatis3中@SelectProvider传递参数方式
Aug 04 #Java/Android
You might like
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
layui实现数据分页功能
2019/07/27 Javascript
Python判断Abundant Number的方法
2015/06/15 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python面向对象程序设计示例小结
2019/01/30 Python
python实发邮件实例详解
2019/11/11 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
简述 Python 的类和对象
2020/08/21 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
护理专业毕业生自我鉴定
2013/10/08 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
设备技术员岗位职责
2015/04/11 职场文书
python基础之while循环语句的使用
2021/04/20 Python
Python必备技巧之字符数据操作详解
2022/03/23 Python