【LeetCode刷题日志】:有效的括号、删除字符串中的所有相邻重复项

85 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

1、写在前面

大家好,这里是【LeetCode刷题日志】。今天的两道题分别是:

  • 有效的括号
  • 删除字符串中的所有相邻重复项

2、内容

2.1、题一

链接:20. 有效的括号 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

(3) 解题

class Solution {
public:
    bool isValid(string s) {
        // 如果字符串的长度为奇数,则返回false
        if (s.length() % 2 != 0) return false;
        // 定义一个工作栈,存储char类型的元素
        stack<char> st;
        // 遍历字符串
        for ( char ch : s) {
            // 如果当前字符是 '(' , 则将 ')' 压入栈
            if (ch == '(') {
                st.push( ')' );
            }
            // 如果当前字符是 '{' , 则将 '}' 压入栈
            else if (ch == '{') {
                st.push('}');
            }
            // 如果当前字符是 '[' , 则将 ']' 压入栈
            else if (ch == '[') {
                st.push(']');
            }
            // 如果字符串还未遍历结束,栈就空了(无对应匹配的字符),此时返回 false
            else if (st.empty()) {
                return false;
            }
            // 在遍历字符串时,如果当前字符与栈顶元素不匹配,则返回 false
            else if(st.top() != ch){
                return false;
            }
            // 当前字符与栈顶元素匹配,则弹出当前的栈顶元素
            else {
                st.pop();
            }
        }
        // 当我们遍历完字符串后,如果栈为空,则说明每个左符号都有对应的右符号与其对应
        if(st.empty()) {
            return true;
        }
        // 如果栈不为空,则说明有某个左符号没有右符号与其对应,此时返回false
        else {
            return false;
        }
    }
};

2.2、题二

链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

(3) 解题

class Solution {
public:
    string removeDuplicates(string s) {
        // 定义一个工作栈st
        stack<char> st;
        // 遍历字符串
        for (char ch : s) {
            // 如果当前工作栈为空,则将当前字符压入栈中
            if(st.empty()) {
                st.push(ch);
            }
            // 如果 当前字符 与 栈顶元素 相匹配,则弹出栈顶元素
            else if(ch == st.top()) {
                st.pop();
            }
            // 如果 当前字符 与 栈顶元素 不匹配,则压入当前字符
            else {
                st.push(ch);
            }
        }
        string str = "";
        while (!st.empty()) { // 将栈中元素放到result字符串汇总
            str += st.top();
            st.pop();
        }
        reverse (str.begin(), str.end()); // 此时字符串需要反转一下
        return str;
    }
};

3、写在最后

好的,今天就先刷到这里。