Leetcode 3.25

news/2024/5/10 16:53:04

LeetCode Hot 100

    • 1.有效的括号
    • 2.最小栈
    • 3.字符串解码

1.有效的括号

有效的括号
这道题肯定是利用了栈先入后出的特性。有以下几种情况
如果当前元素是左括号则push进栈不弹出;
如果当前元素是右括号则弹出栈中前一个元素,并判断是否与当前元素匹配。

class Solution {
public:bool isValid(string s) {stack<char> ans;for (auto s1: s) {if (s1 == '(' || s1 == '{' || s1 == '[') {ans.push(s1);} else {if (ans.empty()) return false;auto tmp = ans.top();//注意这里,s1是右括号if ((s1 == ')' && tmp != '(') || (s1 == '}' && tmp != '{' ) || (s1 == ']' && tmp != '['))return false;ans.pop();}}return ans.empty();}
};

2.最小栈

最小栈
观察题目要求:实现 MinStack 类。实际是想用两个stack类实现MinStack类。难点就在于如何获取最小元素,一个栈正常push元素,另一个栈存放当前栈中的最小元素。
在这里插入图片描述

void push(int val) 将元素val推入堆栈----> stack push(val) 以及 stack_min.push(min(val, stack_min.top()))
void pop() 删除堆栈顶部的元素----> stack.pop() stack_min.pop()
int top() 获取堆栈顶部的元素-----> stack top()
int getMin() 获取堆栈中的最小元素----> stack1.top()
MinStack() 初始化堆栈对象----> stack1.push(INT_MAX)

class MinStack {
public:stack<int> a;stack<int> a_min;MinStack() {a_min.push(INT_MAX);}void push(int val) {a.push(val);a_min.push(min(val, a_min.top()));}void pop() {a.pop();a_min.pop();}int top() {return a.top();}int getMin() {return a_min.top();}
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

3.字符串解码

其实与括号的题目有点类似,用两个栈,分别为数字栈字母栈。

  • 如果是数字入数字栈,字母和左括号就一直入字母栈;

  • 如果遇到了右括号就从字母栈pop, 直到遇到左括号为止,获取到需要重复的子串tmp,注意这里的tmp需要reverse;
    再从数字栈pop一个数字,即为需要重复的次数。

  • 把(重复次数 * 重复字母)的子串再次入字母栈参与下一层重复

  • 最终的结果还需要reverse

class Solution {
public:string decodeString(string s) {string ans;stack<char> stk_s;stack<int> stk_n;int num = 0;for (auto ch: s) {if (ch >= '0' && ch <= '9') {num = num * 10 + ch - '0';} else if (ch == '[') {//把当前子串重复的数字入栈stk_n.push(num);//重新计算下一个子串的重复数字num = 0;stk_s.push(ch);} else if (ch == ']') {//获取需要重复的字符string tmp;//直到遇到'['为止while (stk_s.top() != '[') {tmp += stk_s.top();stk_s.pop();}//弹出'['stk_s.pop();//栈先入后出,所以需要reversereverse(tmp.begin(),tmp.end());//获取重复次数int n = stk_n.top();stk_n.pop();//根据倍数把字母再push回去while (n--) {for (auto ch1: tmp) {stk_s.push(ch1);}}} else {//字母,入栈stk_s.push(ch);}}//栈中元素给stringwhile(stk_s.size()){ans += stk_s.top();stk_s.pop();}reverse(ans.begin(),ans.end());return ans;}
};

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

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

相关文章

Remote Desktop Manager for Mac:远程桌面管理软件

Remote Desktop Manager for Mac&#xff0c;是远程桌面管理的理想之选。它集成了多种远程连接技术&#xff0c;无论是SSH、RDP还是VNC&#xff0c;都能轻松应对&#xff0c;让您随时随地安全访问远程服务器和工作站。 软件下载&#xff1a;Remote Desktop Manager for Mac下载…

小错误,大麻烦:前端开发中的拼写陷阱

一. 问题描述 小错误&#xff0c;大问题&#xff01;在编码中小心拼写错误可能会带来意想不到的后果。比如&#xff0c;将 "message" 错误地写成了 "massage"&#xff0c;结果前端页面显示出了异常。&#x1f631; 如下&#xff1a; 导致前端显示为&…

迷你搜索引擎(算法设计)

解题思路&#xff1a; 1.读取输入&#xff1a;首先读取文件总数N&#xff0c;然后读取每个文件的标题和内容&#xff0c;存储在一个Map中&#xff0c;其中键为文件标题&#xff0c; 值为文件内容的每行集合。 文件存储结构&#xff1a;Map<String, List<String>> …

ubuntu编译OpenCV and seetaFace2

opencv opencv-4.5.2 opencv_contrib-4.5.2 SeetaFace2 SeetaFace2-master https://github.com/seetafaceengine 指定安装目录&#xff0c;和OpenCV放一个目录下了 安装前 安装 安装后 Qt安装 Windows下 Linux下 报错1 原因&#xff1a; 报错…

【python】flask模板渲染引擎Jinja2中的模板继承,简化前端模块化开发

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

百度文心一言(ERNIE bot)API接入Android应用

百度文心一言&#xff08;ERNIE bot&#xff09;API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了&#xff0c;想在android上实现一个对话助手的功能&#xff0c;大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…