题目要求
给定字符串S
,其全部由小写字母组成,删除其中所有的相邻重复项之后返回新的字符串
例如:
input: S='abbaca'
output:'ca'
这是因为删除bb
之后aa
又成为了相邻的重复字符,因此需要删除,最终返回ca
作为最后结果
思路
第一眼看到感觉应该用递归暴力解决就可以吧,结果跑了之后直接超时😁,非常无奈(但是又很菜,属实没有办法),后来稍微改动之后超时问题解决了,再一看还没超过百分五…加油!(在力扣上看到有个大佬直接全员replace(),不得不说是个很好的解法…)
我的做法是疯狂遍历字符串,删完一遍再来一遍,直到最后找不到相邻的重复字符,想法非常简单,实现起来还是要稍微注意,由于字符串本身不支持直接修改,因此考虑转化为List来做。在删除元素的时候就挺让人头疼,因为在循环里面删除的话会导致每个元素的下标发生变化,这样循环变量有时候就会出现错乱,所以在实现时需要尤其注意。
class Solution:
def haveDuplicate(self, s:str) -> bool:
for i in range(0, len(s) - 1):
if s[i] == s[i+1]:
return True
else:
continue
return False
def removeDuplicates(self, S: str) -> str:
if not self.haveDuplicate(S):
return S
else:
s_list = list(S)
s_list.append('A')
for i in range(len(s_list) - 2, -1, -1):
if s_list[i] == s_list[i+1]:
del s_list[i+1]
del s_list[i]
return self.removeDuplicates(''.join(s_list[:-1]))
不得不说这种做法属实是差劲,每次循环之前都要对list的一个部分做遍历(直到遇到相邻重复元),导致方法的复杂度直接就上去了。
这个时候不得不说对数据结构的理解和掌握可以帮助你迅速的找到解决思路,下面我们来看一位大佬的做法:
- 创建一个空的数据栈,用于存储单个的字符。
- 从字符串中依次的去除元素,如果当前取到的元素与栈顶元素相同,则将该元素丢弃并弹出栈顶元素,继续取下一个,若否则直接将其压栈。
- 重复上述过程直到字符串被完整遍历。
可以看到,上述方法在执行时的时间复杂度只是
O
(
n
)
O(n)
O(n),因此效率极高。
代码如下:
class Solution:
def removeDuplicates(self, S: str) -> str:
stack = []
for s in S:
if stack and stack[-1] == s:
stack.pop()
else:
stack.append(s)
return ''.join(stack)