给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。提示:
1 <= S.length <= 20000S仅由小写英文字母组成。
解题思路:栈思想
这道题其实就像消消乐游戏,如果我们是对原字符串进行删除操作的话,那么其实时间复杂度是比较高的,所以我们考虑用一个字符串来搭载这些不相邻重复项,最后返回即可!
而遍历过程中,我们可以使用栈的思想,判断当前栈顶是否有元素,有的话判断栈顶元素是否和当前元素重复,因为栈顶元素就是字符串相对的上一个位置,所以我们就直接将栈顶元素 pop 掉即可!而如果不相等的话,则直接让当前元素入栈即可!
但因为这道题是字符串操作,我们还去用一个 stack 容器的话,最后还得对字符串进行逆序,就很麻烦,所以我们可以直接拿 string 当作一个栈进行操作,操作过程和对 stack 操作是一样的,并且可以一步到位!
class Solution {
public:
string removeDuplicates(string s) {
string ret;
for(int i = 0; i < s.size(); ++i)
{
if(ret.size() != 0 && ret.back() == s[i]) // 只有栈元素不为空且栈顶元素等于s[i]才进行出栈(变成了字符串操作)
ret.pop_back();
else
ret += s[i];
}
return ret;
}
};