输入:一个由小写英文字母组成的字符串 $s$
要求:执行重复删除操作:选择两个相邻且相同的字母并删除它们。这个操作可以在剩余的字符串上重复执行,直到无法继续删除为止。 返回完成所有重复项删除操作后得到的最终字符串。答案保证唯一。
输出:一个字符串,表示最终的结果
思路:有点像连连对消除,两个一消除,还容易引起连锁反应,使用栈处理挺好。(当然直接用string 模拟栈,代码更简洁,最后返回ans的时候,可以省去出栈及reverse环节。)
-
遍历输入字符串:依次读取输入字符串 s中的每个字符 c。
-
判断与栈顶的关系:
-
如果栈为空,或当前字符 c与栈顶字符不相同,则将 c压入栈中。
-
如果当前字符 c 与栈顶字符相同,则说明发现了一对相邻重复项,应执行删除操作。由于栈顶元素是上一个未被删除的字符,我们将栈顶元素弹出,相当于删除了这对重复项。
-
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
string removeDuplicates(string s) {
stack<char> tmp;
for (int i = 0; i < s.size(); i++) {
if (tmp.empty() || s[i] != tmp.top()) {
tmp.push(s[i]);
}
else {
char t = tmp.top();
tmp.pop();
}
}
string ans;
while (!tmp.empty()) {
ans += tmp.top();
tmp.pop();
}
reverse(ans.begin(), ans.end());
return ans;
}
};

被折叠的 条评论
为什么被折叠?



