返回
力扣之逐项删除所有相邻相同字符(数组栈或字符串栈)
前端
2023-10-27 05:39:01
序言:
在计算机科学领域,字符串操作是不可或缺的一部分。字符串的处理和操纵对于许多应用程序和算法至关重要。力扣网站上有一个广为流传的经典问题,要求删除字符串中所有相邻相同的字符。本文将深入探讨解决此问题的两种方法:数组栈和字符串栈。
问题
给定一个由小写字母组成的字符串 S
,执行以下操作:
- 每次选择字符串中相邻且相同的两个字符,并删除它们。
- 重复此操作,直至无法继续删除为止。
返回执行所有删除操作后的最终字符串。
解决方案 1:数组栈
数组栈是一种简单易用的数据结构,可以用作此问题的解决方案。
算法步骤:
- 将字符串
S
转换为字符数组arr
。 - 创建一个空栈
stack
。 - 对于数组
arr
中的每个字符c
:- 如果
stack
为空或stack
栈顶元素与c
不同,则将c
压入stack
。 - 否则,将
stack
栈顶元素和c
出栈。
- 如果
- 将
stack
中的字符按序连接成字符串并返回。
示例代码(Python):
def remove_adjacent(s):
"""
:type s: str
:rtype: str
"""
arr = list(s)
stack = []
for c in arr:
if not stack or stack[-1] != c:
stack.append(c)
else:
stack.pop()
return "".join(stack)
解决方案 2:字符串栈
字符串栈是一种简单而优雅的方法来解决此问题。
算法步骤:
- 初始化一个空字符串
stack
。 - 对于字符串
S
中的每个字符c
:- 如果
stack
为空或stack
最后一个字符与c
不同,则将c
追加到stack
。 - 否则,将
stack
最后一个字符和c
从stack
中移除。
- 如果
- 返回
stack
。
示例代码(Python):
def remove_adjacent(s):
"""
:type s: str
:rtype: str
"""
stack = ""
for c in s:
if not stack or stack[-1] != c:
stack += c
else:
stack = stack[:-1]
return stack
复杂度分析:
这两种方法的时间复杂度均为 O(n) ,其中 n 是字符串 S
的长度。这是因为它们都只对字符串进行了一次线性遍 Resin。空间复杂度也是 O(n) ,因为需要使用栈来存储字符。
总结:
数组栈和字符串栈都是解决力扣删除相邻相同字符问题的有效方法。两种方法的时间和空间复杂度均相同。选择哪种方法取决于个人喜好和问题要求。对于简单的字符串操作,字符串栈可能是一种更便捷的选择,因为它不需要使用额外的数组。但是,对于更复杂的情况,数组栈可能更容易扩展和实现。