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 相关文章推荐
java Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
spring boot项目application.properties文件存放及使用介绍
Jun 30 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
Jun 16 Java/Android
Java 多线程并发FutureTask
Jun 28 Java/Android
HttpClient实现表单提交上传文件
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 开发环境配置(Zend Server安装)
2010/04/28 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
php中的异常和错误浅析
2017/05/03 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
Python 类的继承实例详解
2017/03/25 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
慰问敬老院活动总结
2014/04/26 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis