IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 678. 有效的括号字符串 -> 正文阅读

[数据结构与算法]678. 有效的括号字符串

LeetCode - 678. 有效的括号字符串


题目描述

难度:中等

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

  • 任何左括号 ( 必须有相应的右括号 )。
  • 任何右括号 ) 必须有相应的左括号 ( 。
  • 左括号 ( 必须在对应的右括号之前 )。
  • 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
    一个空字符串也被视为有效字符串。

示例 1:

输入: "()"
输出: True

示例 2:

输入: "(*)"
输出: True

示例 3:

输入: "(*))"
输出: True

注意:

字符串大小将在 [1,100] 范围内。

分析

仔细读题后结合示例分析,简而言之就是左右括号必须在顺序上保持正确,并且在拥有星号的前提下,左右括号必须匹配完整,不能有多余的一方出现;
理清题目思绪后,我们可以利用栈来解决这道题;

先声明两个栈,一个放左括号下标,一个放星号下标;其中主要原理就是所有遍历字符串的时候,将所有碰到的左括号、星号的下标入栈,碰到右括号就去左括号栈中弹出一个左括号下标,用来匹配;如果此时左括号栈中为空,那么就去星号栈弹出一个元素用来匹配;如果两个栈都为空,那么说明右括号没有与之匹配的元素,返回 false;

当字符串遍历完成之后,如果此时左括号栈中还有元素,那么就用星号栈中的星号与之匹配,唯一的 fasle 条件就是当星号栈弹出的索引小于左括号栈弹出的索引,出现这种情况时 星号出现的位置在左括号左边,违背的顺序原则 ( 要想返回 true,星号栈中弹出的元素必须大于左括号栈中弹出的元素)。

代码:

 public boolean checkValidString(String s) {

        Stack<Integer> leftStack = new Stack<>();  // 左括号栈
        Stack<Integer> starStack = new Stack<>();  // 星号栈

        // 从头遍历字符串 遇到左括号入栈 遇到星号入栈 遇到右括号优先左括号元素出栈 其次星号出栈
        for (int i = 0; i < s.length(); i++) {
            char item = s.charAt(i);
            if(item == '('){
                leftStack.push(i);
            }else if(item == '*'){
                starStack.push(i);
            }else {
                if(!leftStack.empty()){
                    leftStack.pop();
                }else if(!starStack.empty()){
                    starStack.pop();
                }else {
                    return false;
                }
            }
        }

        // 字符串遍历完之后
        while (!leftStack.empty() && !starStack.empty()){
            if(leftStack.pop() > starStack.pop()) {  // 最右边的左括号的下标大于最右边的星号下标 代表有一个左括号没有匹配 返回false
                return false;
            }
        }

        return leftStack.empty();
    }

总结

写之前是有观察过官方给的题解,发现利用栈的实现容易被理解和接收,对自己也比较友好,就利用栈的方式实现了。再接再厉!



岁月悠悠,衰微只及肌肤;热忱抛却,颓废必致灵魂

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:31:11  更:2021-09-13 09:32:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 13:53:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码