前言
抱怨两句:前两天leetcode上的每日一题都是找回文串子集之类的题目,对于菜鸟的我来说有点难,确实写了很久还有bug,题目难度分别为中等,困难。今天这道题是简单的,思路比较直接,代码也比较简洁
一、题目是什么?
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string
二、解法
1.我的解法——很简单的暴力算法
个人想的很简单,就是循环遍历字符串,每次遍历的时候看看有没有可以删除的字符对,结束判断条件就用一个flag标记就OK了
另外一点,C++是没有数组越界检查的(CSAPP曰),所以本人非常怕越界出bug,在很多必要不必要的地方都加了一些越界检查
代码如下:
class Solution {
public:
string removeDuplicates(string S) {
int i;
if(S.size()==1) return S;//简单情况单独判断
bool flag;//标记是否已经完成删除
do{
flag=false;
i=0;
while(i<S.size()){
if(S[i]==S[i+1])
{ S.erase(i,2);
flag=true;
}
else{
i++;
}
if(S.size()==1) return S;
}
if(flag==false)//没有修改
break;
}
while(flag==true);
return S;
}
};
作者:kolerk
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/solution/kan-lai-wo-zhi-neng-zuo-chu-lai-jian-dan-ugs5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2.官方解法——栈
先说一下两个解法的不同吧,官方因为调用了栈,所有内存更多,但是时间变少了,只要o(n)即可,但是个人解法就是内存少,但是时间多,而且时间复杂度依赖于string结构。
其实我看到栈这个字的时候,我瞬间就想到了——妙啊!只要将栈顶的元素和下一个元素比较就好了,相同就弹出;不同就压栈。数据结构,永远的神!
代码如下:
class Solution {
public:
string removeDuplicates(string S) {
string stk;
for (char ch : S) {
if (!stk.empty() && stk.back() == ch) {
stk.pop_back();
} else {
stk.push_back(ch);
}
}
return stk;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/solution/shan-chu-zi-fu-chuan-zhong-de-suo-you-xi-4ohr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结
下一次做题,可以想想栈啊,队列啊,树啥的,傻循环确实有点low。。。