leetcode——栈


前言

抱怨两句:前两天leetcode上的每日一题都是找回文串子集之类的题目,对于菜鸟的我来说有点难,确实写了很久还有bug,题目难度分别为中等,困难。今天这道题是简单的,思路比较直接,代码也比较简洁


一、题目是什么?

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string

二、解法

1.我的解法——很简单的暴力算法

个人想的很简单,就是循环遍历字符串,每次遍历的时候看看有没有可以删除的字符对,结束判断条件就用一个flag标记就OK了
另外一点,C++是没有数组越界检查的(CSAPP曰),所以本人非常怕越界出bug,在很多必要不必要的地方都加了一些越界检查
代码如下:

class Solution {
public:
    string removeDuplicates(string S) {
    int i;
    if(S.size()==1) return S;//简单情况单独判断
    bool flag;//标记是否已经完成删除
    do{
    flag=false;
    i=0;
    while(i<S.size()){
        if(S[i]==S[i+1])
       {  S.erase(i,2);
          flag=true;
       }
       else{
           i++;
       } 
       if(S.size()==1) return S;
    }
    if(flag==false)//没有修改
     break;
    } 
    while(flag==true);
    return S;
    }
};

作者:kolerk
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/solution/kan-lai-wo-zhi-neng-zuo-chu-lai-jian-dan-ugs5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.官方解法——栈

先说一下两个解法的不同吧,官方因为调用了栈,所有内存更多,但是时间变少了,只要o(n)即可,但是个人解法就是内存少,但是时间多,而且时间复杂度依赖于string结构。
其实我看到栈这个字的时候,我瞬间就想到了——妙啊!只要将栈顶的元素和下一个元素比较就好了,相同就弹出;不同就压栈。数据结构,永远的神!
代码如下:

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

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/solution/shan-chu-zi-fu-chuan-zhong-de-suo-you-xi-4ohr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

下一次做题,可以想想栈啊,队列啊,树啥的,傻循环确实有点low。。。

### LeetCode 20 有效的括号 C++ 解法 对于 LeetCode 第 20 题“有效的括号”,其核心在于通过的数据结构来验证输入字符串中的括号是否能够正确匹配。以下是基于的 C++ 实现方案: #### 方法概述 该方法利用的特点——先进后出(FILO),逐一遍历输入字符串 `s` 中的字符。如果当前字符是一个开括号,则将其压入中;如果是闭括号,则尝试从顶弹出一个对应的开括号进行匹配。最终,当遍历完成后,若为空则表示所有括号均成功匹配。 #### 具体实现代码 以下提供了完整的 C++ 实现代码[^2]: ```cpp class Solution { public: bool isValid(string s) { std::stack<char> m_stack; for (const auto& v : s) { if (m_stack.empty()) { m_stack.push(v); } else if (compare(m_stack.top(), v)) { m_stack.pop(); } else { m_stack.push(v); } } return m_stack.size() == 0 ? true : false; } private: bool compare(const char& c1, const char& c2) { return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}'); } }; ``` 上述代码定义了一个名为 `Solution` 的类,并在其内部实现了成员函数 `isValid` 和辅助私有函数 `compare`。其中: - 函数 `isValid` 负责接收输入字符串并返回布尔值以表明括号序列是否有效。 - 辅助函数 `compare` 则用于检测两个字符是否构成一对合法的括号组合。 #### 复杂度分析 时间复杂度为 O(n),因为每个字符最多只会被压入和弹出一次堆操作。空间复杂度同样也是 O(n),最坏情况下整个字符串都需要存储到里[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值