【题目】
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
来源:leetcode
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
【示例】
输入:“abbaca”
输出:“ca”
解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
【代码】string+substr()效率低
class Solution {
public:
string removeDuplicates(string S) {
string rs=S;
if(rs.size()==1)
return S;
for(int i=1;i<rs.size();){
if(rs[i]==rs[i-1]){
rs=rs.substr(0,i-1)+rs.substr(i+1);
i=1;
}else
i++;
}
return rs;
}
};
【string模拟栈】
执行用时 :44 ms, 在所有 C++ 提交中击败了45.44% 的用户
内存消耗 :10.4 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
string removeDuplicates(string S) {
string re="";
for(auto x:S)
if(re.size()==0||re.back()!=x)
re+=x;
else
re.pop_back();
return re;
}
};
【stack辅助】
执行用时 :52 ms, 在所有 C++ 提交中击败了36.66% 的用户
内存消耗 :10.8 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
string removeDuplicates(string S) {
string rs="";
stack<char> s;
for(auto x:S)
if(s.empty()||s.top()!=x)
s.push(x);
else
s.pop();
while(!s.empty()){
rs+=s.top();
s.pop();
}
reverse(rs.begin(),rs.end());
return rs;
}
};