LeetCode 678——有效的括号字符串

阅读目录

    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现](#3. 代码实现)

1. 题目

2. 解题思路

需要两个栈,一个用来保存左括号所在的位置索引,一个用来保存星号所在的位置索引。

从左往右遍历字符串,如果是左括号或者星号,则将位置索引分别入栈,如果遇到右括号,首先用左括号栈中的左括号进行匹配,没有左括号则使用星号作为左括号来进行匹配,如果二者都为空,匹配失败。

右括号匹配完后,如果还有余下的左括号没有匹配完,那么就需要在左括号右边的星号来作为右括号进行匹配。

最终,左括号也匹配完,那么字符串有效,因为余下的星号可以作为空字符串。

时间复杂度为 O ( n ) O(n) O(n),空间复杂度也为 O ( n ) O(n) O(n)。

3. 代码实现

c 复制代码
class Solution {
public:
    bool checkValidString(string s) {
        stack<int> left_stack;
        stack<int> star_stack;
        for (size_t i = 0; i < s.size(); ++i) {
            if (s[i] == '(') {
                left_stack.push(i);
            } else if (s[i] == '*') {
                star_stack.push(i);
            } else if (s[i] == ')') {
                if (!left_stack.empty()) {
                    left_stack.pop();
                } else if (!star_stack.empty()) {
                    star_stack.pop();
                } else {
                    return false;
                }
            }
        }
        while (!left_stack.empty() && !star_stack.empty()) {
            if (left_stack.top() > star_stack.top()) {
                return false;
            } else {
                left_stack.pop();
                star_stack.pop();
            }
        }
        return left_stack.empty();
    }
};
相关推荐
好悬给我拽开线3 小时前
ZILOT 论文解析
算法
饮水桶_T4 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘565 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi5 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
鸿蒙开发爱好者6 小时前
下班后做的小工具和小游戏,我把它们整理成了 WyanHub
网络·人工智能·职场和发展·个人开发
地平线开发者6 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet7 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞7 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂8 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot10 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法