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 @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
SpringBoot项目中控制台日志的保存配置操作
Jun 18 Java/Android
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
正则表达式拆分url实例代码
Feb 24 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Java设计模式之代理模式
Apr 22 Java/Android
Java 写一个简单的图书管理系统
Apr 26 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
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 array_flip() 删除数组重复元素
2009/01/14 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
YUI的Tab切换实现代码
2010/04/11 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
javascript中的this详解
2014/12/08 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
JS实现简单省市二级联动
2019/11/27 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
python3.7 sys模块的具体使用
2019/07/22 Python
一年级学生评语大全
2014/04/21 职场文书
根叔历年演讲稿
2014/05/20 职场文书
合同意向书范本
2014/07/30 职场文书
个人四风对照检查材料
2014/09/26 职场文书
社区活动总结
2015/02/04 职场文书
大专护理专业自荐信
2015/03/25 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
创业计划书之服装
2019/10/07 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
golang 如何通过反射创建新对象
2021/04/28 Golang
MySQL 语句执行顺序举例解析
2022/06/05 MySQL
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS