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 相关文章推荐
Spring boot应用启动后首次访问很慢的解决方案
Jun 23 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
Java Spring 控制反转(IOC)容器详解
Oct 05 Java/Android
java多态注意项小结
Oct 16 Java/Android
JVM之方法返回地址详解
Feb 28 Java/Android
java objectUtils 使用可能会出现的问题
Feb 28 Java/Android
使用HttpSessionListener监听器实战
Mar 17 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
Java实现HTML转为Word的示例代码
Jun 28 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转换IP地址到真实地址的方法详解
2013/06/09 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
python批量制作雷达图的实现方法
2016/07/26 Python
python调用百度REST API实现语音识别
2018/08/30 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python 实现兔子生兔子示例
2019/11/21 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Python基于execjs运行js过程解析
2020/11/27 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
财务会计实习报告体会
2013/12/20 职场文书
大学生职业生涯规划范文
2013/12/31 职场文书
促销活动总结范文
2014/04/30 职场文书
保险专业求职信
2014/07/07 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
委托书格式要求
2015/01/28 职场文书
工程部岗位职责范本
2015/04/11 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书