编程题-删除字符串中所有相邻重复项

题目:

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

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

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

解题:

充分理解题意后,我们可以发现,当字符串中同时有多组相邻重复项时,我们无论是先删除哪一个,都不会影响最终的结果。因此我们可以从左向右顺次处理该字符串。栈。我们只需要遍历该字符串,如果当前字符和栈顶字符相同,我们就贪心地将其消去,否则就将其入栈即可。

由于 std::string 类本身就提供了类似「入栈」和「出栈」的接口,因此我们直接将需要被返回的字符串作为栈即可。对于其他的语言,如果字符串类没有提供相应的接口,则需要在遍历完成字符串后,使用栈中的字符显式地构造出需要被返回的字符串。如下为代码:

class Solution {
public:
    string removeDuplicates(string s) {
        //定义string类型(以包含入栈出栈的相似接口操作)
        string stk;
        for (char ch : s) {
            //stk.back()为取字符串最后的元素,stk.pop_back()为清除字符串最后一位元素
            if (!stk.empty() && stk.back() == ch) {
                stk.pop_back();
            } else {
                //stk.push_back为将ch类型字符压入string类型的栈
                stk.push_back(ch);
            }
        }
        return stk;
    }
};

笔者小记

1、std::string类本身意见提供了类似栈操作的接口函数,因此我们直接通过stk.back()、stk.pop_back()、stk.push_back()函数,进行字符串取最后一位元素、移除最后一位元素、压入最后一位元素。在利用C++编写时可直接使用,极大简化代码编写复杂度。

2、std::string类本身还提供了对string字符串类型的各种判断操作函数,下面将结合笔者刷到的题目做一个记录,std::string a(1, tolower(c))代码中tolower()函数为将char类型的大写英文字母转换成小写的英文字母,如果是小写的英文字母或其他char字符符号则不进行转换与原始字符相同,std::string a()为将char类型的字符tolower(c)强制转换为string类型的字符串string a

除此之外,std::isalpha(c) 是 C++ 标准库中的一个函数,用于判断字符 c 是否是一个字母(即字母字符),判断得到的结果是bool类型。如果char类型字符c是一个字母,则返回true,不是一个字母则返回false。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值