用不同的思路实现括号匹配(java)

news2024/9/28 17:31:28

给定一个只包括 '(',')' 的字符串,判断字符串是否有效。 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
以上就是题目要求

利用替换的思想

()()()()()()()(())

例如需要判断例子中的括号是否有效,用替换的思想具体就是

  • 将字符串中所有的()替换为"";
  • 这样一轮下来之后成对的()就会消失
  • 如例子中就会只剩下
    在这里插入图片描述
  • 然后进行第二轮的时候就会又替换掉
  • 这样所有的()都会消失掉
  • 最后判断字符串的长度是不是0
  • 如果是0则表明这串字符中的括号有效
  • 那如果不满足条件怎么办
()((()((()))))

在这里插入图片描述

  • 首先红框标注的部分就会消失(被""替换)
  • 现在就剩下(((())))
  • 一轮又一轮之后就剩下),
  • 这里的判断条件就是新的字符串不为0
  • 并且新的长度要比旧的长度小

【具体代码】

public class Test2_2 {
    public static void main(String[] args) {
        System.out.println(isEffective("))))))"));
    }

    public  static boolean isEffective(String str){
        int oldLength = str.length();
        if(oldLength % 2 == 0){
            return false;
        }
        String newStr = str.replace("()","");
        int newLength = str.length();
        while (newLength != oldLength && newLength != 0){
            newLength = oldLength;
            newStr = newStr.replace("()","");
            newLength = newStr.length();
        }
        return newLength == 0;
    }
}

利用栈的思想

  • 遇见左括号的时候入栈
  • 遇见右括号的时候和栈顶的元素进行比较
  • 如果相同则栈中的元素出栈
  • 如果不相同则返回错误在这里插入图片描述
import java.util.Scanner;

/**
 * 利用栈进行操作
 */
public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(judge(str));
    }

    /**
     * 定义一个方法来判断是否括号匹配
     * @param str
     * @return
     */
    public static boolean judge(String str){
        Astack st = new Astack(str.length()/2);
        int i = 0;
        char e;
        boolean flag = false;
        while(i < str.length()){
            e = str.charAt(i);
            if(e=='('){
                st.push(e);
            }
            else {
                if(e == ')'){
                    if(st.isEmpty()){
                        flag = false;
                        break;
                    }
                    if(st.peek() != '('){
                        flag = false;
                        break;
                    }
                    st.pop();
                }
            }
            if(st.isEmpty()){
                flag = true;
            }
            i++;
        }
        return flag;
    }

    /**
     * 用数组模拟一个栈的类
     */
    public static class Astack{
        private int top = -1;
        private int maxsize;
        private char []stack;

        /**
         * 用数组定义一个栈,大小为maxsize;
         * @param maxsize
         */
        public Astack(int maxsize){
            this.maxsize = maxsize;
            stack = new char[maxsize];
        }
        /**
         * 判断栈满
         */
        public boolean isFull(){
            return top == maxsize - 1;
        }
        /**
         * 判断栈空
         */
        public boolean isEmpty(){
            return top == -1;
        }
        /**
         * 入栈
         */
        public void push(char s){
            if(!isFull()){
                top++;
                stack[top] = s;
            }
        }
        /**
         * 出栈
         */
        public char pop(){
            if(isEmpty()){
                throw new RuntimeException("栈满");
            }
            char data = stack[top];
            top -- ;
            return data;
        }
        public char peek(){
            if(isEmpty()){
                throw new RuntimeException();
            }
            return stack[top];
        }
    }
}

【注意】可以用数组模拟一个栈(虽然java中有栈),模拟站的进栈,出栈,取栈顶,判断栈是不是为空,判断栈满等等

栈的简化版

明显可以看出上面的代码比较麻烦,那么可以用栈的思想而不用栈来实现这个题的代码

  • 先定义一个left
  • 从左向右遍历数组
  • 如果出现(则left++,出现则left- -
  • 最后看left是不是0

【代码实现】

public class test4 {
    public static void main(String[] args) {
        System.out.println(isEffective("()"));
    }
    public static boolean isEffective(String str){
        int left = 0;
        for (int i = 0; i < str.length(); i++) {
            char e = str.charAt(i);
            if(e == '('){
                left ++;
            }
            else {
                if(left == 0){
                    return false;
                }
                left --;
            }
        }
        return left == 0;
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣sql简单篇练习(二十一)

力扣sql简单篇练习(二十一) 1 使用唯一标识符替换员工ID 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT e2.unique_id,e1.name FROM Employees e1 LEFT JOIN EmployeeUNI e2 ON e1.ide2.id1.3 运行…

使用netlify实现自动化部署前端项目(无服务器版本)

介绍 本文以 github仓库进行介绍关联netlify的无服务前端自动化部署。用途&#xff1a;个人网站设计、小游戏等当然这只是让你入门~具体细节等待你自己去探索 实现 打开官方网站 如果没有注册过的账户&#xff0c;你需要使用 github 去进行登录。注册完成后会自动给你提示填…

有关Windows域信任关系的一系列知识

简单的总结了一下来自这篇文章的知识点 https://www.kroll.com/-/media/kroll/pdfs/publications/rootedcon2019-pentesting-active-directory-forests-carlos-garcia.pdf 视频录像为 https://www.youtube.com/watch?v6aV5tZlQ2EQ&t10s&themeRefresh1 森林 域是由树和…

项目管理的工作内容有哪些?

首先&#xff0c;什么是项目管理&#xff1f; 项目管理是为了交付项目成果&#xff0c;包括“规划&#xff08;尤其关注估算&#xff09;——实施——确保成功”。项目管理可以用在所有事情上&#xff0c;当然&#xff0c;这个定义听起来可能还不够清晰&#xff0c;但它的好处…

华为机试题:HJ91 走方格的方案数(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

剑指offer06.从尾到头打印链表

题目描述 解题思路 遍历链表&#xff0c;依次将元素压入栈中。然后依次弹出栈顶元素&#xff0c;存入数组返回。程序 class Solution { public:vector<int> reversePrint(ListNode* head) {ListNode *phead;stack<int> s1;while(p!NULL) //遍历链表&#xff0c;元…

jetson-Linux上 python 部署yolov5报错总结

第一个问题&#xff1a;python报错 illegal instruction报错先上图这报错&#xff0c;emmmmm&#xff0c;我是小白&#xff0c;多谢大佬的笔记&#xff0c;帮我解决了&#xff0c;虽然我也没搞懂。。。。嘿嘿具体解决办法就是&#xff1a;临时运行代码&#xff1a;1-在运文件前…

优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止

在使用 SpringBoot 的时候&#xff0c;都要涉及到服务的停止和启动&#xff0c;当我们停止服务的时候&#xff0c;很多时候大家都是kill -9 直接把程序进程杀掉&#xff0c;这样程序不会执行优雅的关闭。而且一些没有执行完的程序就会直接退出。 我们很多时候都需要安全的将服…

SAP 采购定价过程字段解析

下面我们针对每一个字段进行解释和用途分析 &#xff1a; 1、 步骤&#xff1a;代表了创建PO时&#xff0c;哪个条件类型放到前面&#xff0c;哪个放到后面&#xff0c;如果步骤号相同&#xff0c;那就以谁先选择出来谁就在前面。 2、 计数&#xff1a;没有任何实际意义&a…

web,h5海康视频接入监控视频流记录二(后台node取流)

首先将自己的appkey,secret以及对应参数填上&#xff0c;看看是否能够取流成功。 ws取流是需要开通559端口的&#xff0c;可以联系海康技术开放&#xff0c;以及mgc需要升级版本。 普通模式的话 需要升级mgc到5.13.102版本&#xff0c;可以找下现场技术帮你升级&#xff0c;先…

Java | IO 模式之 JavaBIO 应用

文章目录IO模型Java BIOJava NIOJava AIO&#xff08;NIO.2&#xff09;BIO、NIO、AIO的使用场景BIO1 BIO 基本介绍2 BIO 的工作机制3 BIO 传统通信实现3.1 业务需求3.2 实现思路3.3 代码实现4 BIO 模式下的多发和多收消息4.1 业务需求4.2 实现思路4.3 代码实现5 BIO 模式下接收…

大V龚文祥造谣董明珠恋情被禁言

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 因造谣董明珠与王自如恋情&#xff0c;知名大V龚文祥老师被今日头条禁言。龚文祥说&#xff0c;69岁的董明珠&#xff0c;找了一个小自己34岁的男友&#xff0c;引的网友议论纷纷。 2月26日&#…

使用Python和OpenCV制作电影般的截屏相册!

目录 简介&#xff1a; 实现步骤&#xff1a; 代码说明&#xff1a; 报错error&#xff1a; 问题所在&#xff1a; 解决方法&#xff1a; 1&#xff09;卸载&#xff1a; 2&#xff09;重新安装&#xff1a; 3&#xff09;安装成功&#xff1a; 效果如下&#xff1a; 简…

DockQuery 天狼 v1.2.0 正式发布

DockQuery 天狼经过 2022 年的孵化&#xff0c;于 2022 年年底发布了第一个版本。 在春回大地万象更新之际&#xff0c;DockQuery 发布了 1.2.0 版本&#xff0c;也是我们公开招募第一批产品体验官的版本。 在这个版本中&#xff0c;DockQuery 主要专注以下几个主题&#xff…

电影《毒舌律师》观后感

上周看了《毒蛇律师》这部电影&#xff0c;讲述一位’大律师’在法庭为己方辩护&#xff0c;最终赢得辩护的故事。 &#xff08;1&#xff09;人之常情 说起法律相关&#xff0c;不禁会让人联想到讲法律相关知识的罗翔老师&#xff0c;平时也会看他相关视频&#xff0c;无论是亲…

开发中遇到的问题合集

集合相关 1.JDK版本冲突导致的报错 报错信息&#xff1a; Set.of、List.of、Path.of 如果在 JDK 1.8 的项目中使用 Set.of() 方法报错&#xff0c;可能是因为该方法是 JDK 9 中新增的&#xff0c;不被 JDK 1.8 所支持。 如果你需要在 JDK 1.8 中使用类似的功能&#xff0c;可…

前端:CSS

CSS基本语法规则&#xff1a;选择器若干属性声明 style标签&#xff1a;可以放到代码的任意位置处&#xff0c;head/body中都可以 三种写CSS的方式&#xff1a; 1、内部样式&#xff1a;使用style标签&#xff0c;直接把CSS写到html文件中。此时的style标签可以放到任何位置…

BMI160 BOSCH/博世 六轴 加速度 陀螺仪 传感器

BMI160 6轴惯性运动传感器&#xff0c;采用MEMS传感器封装&#xff0c;将16位3轴加速度计和超低功耗3轴陀螺仪集成在一起。当加速度计和陀螺仪在全速模式下运行时&#xff0c;耗电典型值低至950A&#xff0c;仅为市场上同类产品耗电量的50%或者更低。 Bosch BMI160专为智能手机…

7 款最好的免费 PDF 转 Word 转换器工具

将 PDF 到 Word 转换软件下载到您的计算机将节省您一遍又一遍地访问浏览器的时间。在执行转换任务时&#xff0c;您也不会受到文件大小或数量的限制。现在阅读这篇文章&#xff0c;了解可免费下载的 7 种最佳 PDF 转 Word 转换器软件&#xff0c;以及在转换器中寻找什么。 哪个…

浅谈React Fiber工作原理

静态数据结构 每个 Fiber 节点对应一个组件&#xff0c;保存了该组件的类型&#xff0c;对应的 DOM 节点的对应信息。 FiberRootNode 有且仅有一个&#xff0c;而 rootFiber 可以有多个&#xff0c;因为我们可以挂载多个应用&#xff08;也就是多次调用ReactDOM.render&#…