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
Java elasticsearch安装以及部署教程
Jun 28 Java/Android
HashMap实现保存两个key相同的数据
Jun 30 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
Jul 26 Java/Android
idea 在springboot中使用lombok插件的方法
Aug 02 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
利用Sharding-Jdbc进行分库分表的操作代码
Jan 22 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
java开发双人五子棋游戏
May 06 Java/Android
Android 中的类文件和类加载器详情
Jun 05 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使用数组实现队列
2012/02/05 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
Python读大数据txt
2016/03/28 Python
python直接访问私有属性的简单方法
2016/07/25 Python
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
文秘自荐信
2013/10/20 职场文书
自我鉴定200字
2013/10/28 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
社区结对共建协议书
2016/03/23 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS