day11 有效的括号 删除字符串中的所有相邻重复项 逆波兰表达式求值

news2024/11/24 21:46:15

题目1:20 有效的括号

题目链接:20 有效的括号

题意

判断字符串是否有效,若有效:

1)左括号必须用相应的右括号

2)左括号的闭合顺序正确  ({)}顺序不正确,应该是({})

3)右括号都对应相同类型的左括号

栈适合做对称匹配类的题目

分类:有3种不匹配的情况

遇到左括号,栈里放入对应的右括号;遇到右括号,就将该元素与栈口的元素进行比较

逻辑

例1:为啥要用栈,使用队列不行吗

代码

class Solution {
public:
    bool isValid(string s) {
        stack<int> st;
        //剪枝,括号匹配是2的倍数
        if(s.size()%2!=0){
            return false;
        }
        for(int i=0;i<s.size();i++){
            //遇到左括号
            if(s[i]=='('){
                st.push(')');
            }
            else if(s[i]=='['){
                st.push(']');
            }
            else if(s[i]=='{'){
                st.push('}');
            }
            //不匹配,右边多括号
            else if(st.empty()||s[i]!=st.top()){
                return false;
            }
            //匹配
            else{
                st.pop();
            }
        }
        //左边多括号
        return st.empty();
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

题目2:1047 删除字符串中的所有相邻重复项

题目链接:1047 删除字符串中的所有相邻重复项

题意

反复删除字符串(小写字母组成)S中两个相邻的相同的字母

栈非常适合解决匹配对称问题

栈中存放遍历过的元素,栈顶元素与当前遍历的元素不匹配时,就将当前元素放入栈中;如果二者匹配,就将栈顶元素弹出,但是最终返回的数组需要再reverse一下,数组中元素的顺序才正确

代码

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;//栈中放的是一个个字符(char类型),不是string类型
        for(int i=0;i<s.size();i++){
            if(st.empty()||st.top()!=s[i]){
                st.push(s[i]);
            }
            else{
                st.pop();
            }
        }
        string result = "";
        while(!st.empty()){
            result.push_back(st.top());//从记录到result的顺序是颠倒的
            st.pop();
        }
        reverse(result.begin(),result.end());
        return result;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

数组

受到上面栈的启发,使用数组替换也可以

直接拿着数组当作栈来使用,逻辑与栈一样,最终直接返回这个数组就可以了

代码

class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for(char str:s){
            if(result.empty()||result.back()!=str){
                result.push_back(str);
            }
            else{
                result.pop_back();
            }
        }
        return result;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1),返回值不计空间复杂度

逻辑

例1:能否使用队列?

使用1个队列不合适,因为队列是先入先出的结构,会弹出不必要的元素

使用两个队列的话,第二个个队列做备份,当第一个队列对应相同的元素弹出时,再将备份队列中的元素放到第一个队列中,就是上节模拟栈的那个代码,但是会有错误,原因就是相同的元素使得最终定位查找的时候很难

题目3:150 逆波兰表达式

题目链接:150 逆波兰表达式求值

题意

计算字符串数组tokens(表示为逆波兰表达式的算术表达式)的结果

最终的结果以及中间结果可以用32位整数表示,

遇到数字,则入栈,遇到运算符(+ - * /)取出栈顶的两个元素计算,将结果压入栈

逆波兰表达式就是二叉树的后序遍历(左右中)

① 注意字符串是string类型的数组,引用其中的某个元素要用""

② 注意运算顺序,nums2在前

③ 注意st定义的是int类型的,方便直接拿出来进行运算,所以最终放到st的各个string类型的数字要转化为int类型,这样才可以参与运算

代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {//tokens里面的每个元素是string类型,
        stack<int> st;//栈内元素是整数类型,栈中的元素才可以拿出来运算
        for(int i=0;i<tokens.size();i++){//这里必须使用"",因为tokens是string类型的数据
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
                int nums1 = st.top();
                st.pop();
                int nums2 = st.top();
                st.pop();
                if(tokens[i]=="+"){//一定要将nums2放在前面
                    st.push(nums2 + nums1);
                }
                else if(tokens[i]=="-"){
                    st.push(nums2 - nums1);
                }
                else if(tokens[i]=="*"){
                    st.push(nums2 * nums1);
                }
                else if(tokens[i]=="/"){
                    st.push(nums2 / nums1);
                }
            }
            else{
                st.push(stoi(tokens[i]));//因为st是int型的,而tokens是string类型的,所以进行类型转换
            }
        }
        int result = st.top();
        st.pop();
        return result;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

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

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

相关文章

深度解析Nginx负载均衡算法及配置实例

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Python3从零基础到入门(1)

目录 一、环境搭建 1.检测Python环境 2.下载安装Python环境 3.VSCode中配置Python环境 二、第一个程序 1.编码 2.输出 3.标识符 4.import 5.保留字 6.注释 7.缩进 三、变量和赋值 1.Python 中的变量 2.变量的赋值 3.多个变量赋值 四、基础数据类型 1.类型查看…

智能音箱喇叭杂音问题

智能音箱喇叭杂音问题 智能音箱生厂或出货过程会遇到多种喇叭播放有杂音的问题&#xff0e; 螺丝不匹配 智能音箱设备在生产过程&#xff0c;会有SPL测试喇叭失真&#xff0c;发现不良率8%的杂音问题&#xff0e; 分析原因是来料导入了新螺丝&#xff0c; 使用过程进入异物…

harmonyOS 时间选择组件(TimePicker)

本文 我们来说 TimePicker 时间组件 首先 我们搭一个最基本的组件骨架 Entry Component struct Index {build() {Row() {Column() {}.width(100%)}.height(100%)} }然后 在 Column 组件内 放一个 TimePicker进去 这里 我们就可以看到 一个时间的选择器了 DatePicker 捕获当前…

EPQ艾森克人格测试 49题(免费版)

艾森克人格提出人格的三个基本因素&#xff1a;性格内外向E、神经质N&#xff08;也叫情绪性&#xff09;和精神质P。这三个维度的不同程度组合&#xff0c;形成了独立的个体人格特征。 其中性格内外向维度是目前评估性格内向和外向的成熟量表&#xff0c;神经质和精神质为人格…

机器人技能学习-robosuite-0-入门介绍

文章目录 前言模块介绍实战案例1&#xff1a;从 demo 中创建自己的 env案例2&#xff1a;更换属于自己的物体 前言 资料太少、资料太少、资料太少&#xff0c;重要的事说三边&#xff0c;想根据自己实际场景自定义下机器人&#xff0c;结果发现无路可走&#xff0c;鉴于缺少参…

Maven初学Day1

1.Maven是什么&#xff1f; 是一个构建工具&#xff0c;可以自动化构建过程、任务。是一个项目模型 2.作为构建工具有什么特点 1.跨平台&#xff0c;可以在多个操作系统上使用 2.对外提供一致的操作接口 3.Maven官网 https://maven.apache.org/download.cgi 4.安装步骤 …

卷积神经网络|迁移学习-猫狗分类完整代码实现

还记得这篇文章吗&#xff1f;迁移学习|代码实现 在这篇文章中&#xff0c;我们知道了在构建模型时&#xff0c;可以借助一些非常有名的模型&#xff0c;这些模型在ImageNet数据集上早已经得到了检验。 同时torchvision模块也提供了预训练好的模型。我们只需稍作修改&#xf…

外延炉及其相关的小知识

外延炉是一种用于生产半导体材料的设备&#xff0c;其工作原理是在高温高压环境下将半导体材料沉积在衬底上。 硅外延生长&#xff0c;是在具有一定晶向的硅单晶衬底上&#xff0c;生长一层具有和衬底相同晶向的电阻率且厚度不同的晶格结构完整性好的晶体。 外延生长的特点&…

Linux实验——页面置换算法模拟

页面置换算法模拟 【实验目的】 &#xff08;1&#xff09;理解虚拟内存管理的原理和技术。 &#xff08;2&#xff09;掌握请求分页存储管理的思想。 &#xff08;3&#xff09;理解常用页面置换算法的思想。 【实验原理/实验基础知识】 存储器是计算机系统的重要资源之…

腾讯面试总结

腾讯 一面 mysql索引结构&#xff1f;redis持久化策略&#xff1f;zookeeper节点类型说一下&#xff1b;zookeeper选举机制&#xff1f;zookeeper主节点故障&#xff0c;如何重新选举&#xff1f;syn机制&#xff1f;线程池的核心参数&#xff1b;threadlocal的实现&#xff…

揭开JavaScript数据类型的神秘面纱

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 JavaScript作为一门动态类型语言,其数据类型一直是开发者们关注的话题。本文将深入探讨Jav…

C语言算法(二分查找、文件读写)

二分查找 前提条件&#xff1a;数据有序&#xff0c;随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…

MidTool的AIGC与NFT的结合-艺术创作和版权保护的革新

在数字艺术和区块链技术的交汇点上&#xff0c;NFT&#xff08;非同质化代币&#xff09;正以其独特的方式重塑艺术品的收藏与交易。将MidTool&#xff08;https://www.aimidtool.com/&#xff09;的AIGC&#xff08;人工智能生成内容&#xff09;创作的图片转为NFT&#xff0c…

数据库基础知识1

目录 数据库的使用 登录mysql 命令语法 常用命令 ​编辑 navicat建立连接 mysql授权管理命令 ​编辑mysql权限 数据导入导出 实例 数据导出 未登录 已经登录 导出导入的代码对比 ​编辑 导入导出的一个坑 python的导入导出 数据库基础知识 特点 需要掌握的程…

嵌入式——循环队列

循环队列 (Circular Queue) 是一种数据结构(或称环形队列、圆形队列)。它类似于普通队列,但是在循环队列中,当队列尾部到达数组的末尾时,它会从数组的开头重新开始。这种数据结构通常用于需要固定大小的队列,例如计算机内存中的缓冲区。循环队列可以通过数组或链表实现,…

使用Docker-compose快速构建Nacos服务

在微服务架构中&#xff0c;服务的注册与发现扮演着至关重要的角色。Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的服务注册与发现组件&#xff0c;致力于支持动态配置管理和服务发现。最近&#xff0c;一位朋友表达了对搭建一套Nacos开发环…

速卖通店铺销量飙升:掌握自养号测评(补单),轻松提升销售量

很多卖家在经营速卖通店铺时&#xff0c;都希望能提高自己店铺的曝光率。但对于一些新手卖家来说&#xff0c;可能不太清楚曝光率的具体含义以及如何提升。那么&#xff0c;让我们一起来探讨一下这个问题。 曝光率&#xff0c;简而言之&#xff0c;是指您的店铺和产品展示给顾…

springboot git配置文件自动刷新失败问题排查

http://{ip}:{port}/refresh 说明&#xff1a;springBoot版本是1.5.9&#xff0c;接口路径与2.x&#xff0c;不同 路径区别&#xff1a;/refresh VS /actuator/refresh 用postman调用refresh接口刷新git配置&#xff0c;报错如下&#xff0c;没有权限 在服务本地启动&#…

【Java】2023年业务实践中遇到的所有OOM情况及实战总结

OOM分析&实战 引言&#xff1a;一、JVM内存结构二、JVM OOM错误情况三、实践案例一案例二案例三 四、总结五、分析工具推荐六、参考文献 引言&#xff1a; 在Java开发中&#xff0c;随着应用程序变得越来越复杂&#xff0c;内存管理问题也变得愈加重要。而在JVM中的"O…