代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

简介: 代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

20. 有效的括号

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char>s_s;
        //返回条件:
        //1 遍历结束 栈不为空 返回false,因为符号与栈顶匹配的都被pop出了
        //2 遍历途中栈为空,待插入字符为括号右边符号则直接返回false;一开始就是右边符号肯定是错误的
        //3 遍历途中栈不为空,符号不等于栈顶值且是括号右边值则直接返回 false;同理等待插入的符号为符号左边那一定是错误的,因为括号位置左右反了。
        for(int i = 0;i< s.size();++i){
            char val = s[i];
                if(!s_s.empty() && val==s_s.top()){
                    s_s.pop();
                }else{
                    switch (val){
                        case '(' : s_s.push(')');break;
                        case '[' : s_s.push(']');break;
                        case '{' : s_s.push('}');break;
                        default :return false; //栈为空且字符为括号右边,直接返回false;
                    }
                }
        }
        return s_s.empty();
    }
};

思路

使用栈先入后出的属性可以实现,栈插入的字符全部是括号右边。

1 栈为空的情况下要插入的字符是左边括号则直接返回false;因为一开始的插入了左侧括号后面是无法在括号规则正确的情况下弹出括号的。如“)(”,遍历找到了‘)’则要插入的符号为‘(’,显然这是不可以的。

2 栈不为空的情况下栈顶值不等于当前遍历的字符,且字符为右边括号,直接返回false;因为栈顶值不等于当前被遍历的字符,则说明当前括号的右边括号是准备被插入的字符,如果括号本身已经是右边字符则无法插入,说明该括号是一个不配对的字符。如“{ } { ) }”‘{’插入的是‘}’,‘}’与栈顶值‘}’相等

所以pop掉,同样地,第三个字符‘{’要插入栈顶的是‘}’,‘)’不等于栈顶部值,则‘)’会被作为一个要插入栈顶的字符,但是如果插入了则后面就不会有右边字符与其匹配,所以不能插入,字符串括号不匹配。

3 遍历结束后栈为空则返回ture,否则返回false;

难点

上述三点一开始不太好想到。

总结

简单题。主要加深对栈的使用。

1047. 删除字符串中的所有相邻重复项

代码

class Solution {
public:
    string removeDuplicates(string s) {
        string res;
        for(char val :s){
            if(!res.empty() && val == res.back()){
                res.pop_back();
            }else{
                res.push_back(val);
            } 
        }
        return res;
    }
};

思路

采用栈的思想,遍历字符,如果栈内的字符和当前字符相等则将其弹出,继续下一层遍历,直到所有字符都遍历完成,栈内剩下的字符就是不相邻的字符,将其反转就可以得到结果

难点

不难

总结

也是考察对栈的使用

150. 逆波兰表达式求值

代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> number;
        for(string val : tokens){
            if(val == "+"||val=="-"||val=="*"||val=="/"){
            long long res1  = number.top();
            number.pop();
            long long res2 = number.top();
            number.pop();
            if(val == "+") number.push(res2 + res1);
            if(val == "-") number.push(res2 - res1);
            if(val == "*") number.push(res2 * res1);
            if(val == "/") number.push(res2 / res1);
            }else{ 
                number.push(stoi(val));
            }
        }
        return number.top();
    }
};

思路

遍历字符,将不等于+-*/的字符全部转换成数字存入站内,字符串的前面一定是数字字符。所以遍历到+-*/时就可以栈顶两个元素弹出,计算出结果后在插入栈顶,直到遍历结束,栈顶值就是逆波兰表达式的结果。

难点

要理解什么是逆波兰表达式。

总结

深入理解了栈这种数据结构。

参考来源

有效括号:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html

删除字符串中的所有相邻重复项:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html

逆波兰表达式:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

相关文章
|
5天前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
115 65
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
8 2
|
3天前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
6天前
|
搜索推荐 算法 Java
|
13天前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
67 2
|
6天前
|
搜索推荐 算法 Java
插入排序算法(Java代码实现)
这篇文章通过Java代码示例详细解释了插入排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过插入排序对数组进行升序排列。
|
8天前
|
机器学习/深度学习 算法 Python
python与朴素贝叶斯算法(附示例和代码)
朴素贝叶斯算法以其高效性和优良的分类性能,成为文本处理领域一项受欢迎的方法。提供的代码示例证明了其在Python语言中的易用性和实用性。尽管算法假设了特征之间的独立性,但在实际应用中,它仍然能够提供强大的分类能力。通过调整参数和优化模型,你可以进一步提升朴素贝叶斯分类器的性能。
18 0
|
11天前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
10 0
|
15天前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
26 0

热门文章

最新文章