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常用工具类汇总 附示例代码
Jun 26 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
浅谈自定义校验注解ConstraintValidator
Jun 30 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
Java字符串逆序方法详情
Mar 21 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
MyBatis XPathParser解析器使用范例详解
Jul 15 Java/Android
app场景下uniapp的扫码记录
Jul 23 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 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
Python基类函数的重载与调用实例分析
2015/01/12 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
Python3中详解fabfile的编写
2018/06/24 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
python中round函数如何使用
2020/06/19 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
会展中心部门工作职责
2013/11/27 职场文书
活动总结新闻稿
2014/08/30 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python