题目:
给出由小写字母组成的字符串 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;
}
};
特别注意:std::string类本身意见提供了类似栈操作的接口函数,因此我们直接通过stk.back()、stk.pop_back()、stk.push_back()函数,进行字符串取最后一位元素、移除最后一位元素、压入最后一位元素。在利用C++编写时可直接使用,极大简化代码编写复杂度。
标签:ch,string,删除,编程,back,stk,相邻,字符串 From: https://blog.csdn.net/qq_43287713/article/details/144946207