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 相关文章推荐
浅谈@Value和@Bean的执行顺序问题
Jun 16 Java/Android
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
Java反应式框架Reactor中的Mono和Flux
Jul 25 Java/Android
详解JAVA的控制语句
Nov 11 Java/Android
Java详细解析==和equals的区别
Apr 07 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
Apr 20 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
java实现面板之间切换功能
Jun 10 Java/Android
Android实现获取短信验证码并自动填充
May 21 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
基于mysql的bbs设计(四)
2006/10/09 PHP
一个简洁的多级别论坛
2006/10/09 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
《月迹》教学反思
2014/02/19 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
论文致谢词范文
2015/05/14 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python