本题使用了栈这种先进后出的数据结构来存储字符串,当遇到相邻重复项时弹出前一个字符,以实现删除字符串中的相邻重复字母的功能。
时间复杂度:O(n),空间复杂度:O(n)
思路:
- 遍历字符串,如果栈为空,则直接将当前字母压入栈中
- 如果当前字母和栈顶字母相同,则弹出栈顶字母,即删除操作
- 如果当前字母和栈顶字母不相同,则将当前字母压入栈中。
- 最后,更改字符串大小为剩余的栈内元素大小,再将栈内剩余的不相邻重复的字母倒序存入字符串中并返回。
代码:
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (st.empty()) // 如果栈为空,则直接压入
st.push(s[i]);
else if (s[i] == st.top()) // 如果相同,则弹出相同的字母
st.pop();
else // 如果不相同,则压入
st.push(s[i]);
}
// 将栈内的数据倒序存入字符串s中
s.resize(st.size());
for (int i = st.size() - 1; i >= 0; i--) {
s[i] = st.top();
st.pop();
}
return s;
}
};