解决字符串删除相邻重复字符问题
问题描述:
你可能遇到过这样的字符串处理问题:
给定一个由小写字母组成的字符串 s,可以反复进行以下操作:选择两个相邻且相同的字母并删除它们。你的任务是返回在不断删除操作之后,剩下的字符串。
示例:
- 输入:
s = "abbaca"输出:"ca" - 输入:
s = "azxxzy"输出:"ay" - 输入:
s = "a"输出:"a"
解题思路:
这个问题的核心思路是通过 栈 来模拟删除相邻重复字符的过程。栈这种数据结构非常适合解决此类问题,因为它支持后进先出的操作,能够高效地处理字符的删除操作。
具体步骤:
-
遍历字符串
s中的每个字符。 -
使用栈保存字符:
- 如果当前字符与栈顶字符相同,说明找到了相邻的重复字符,我们就删除这对字符(即从栈中弹出栈顶字符)。
- 如果当前字符与栈顶字符不同,则将当前字符压入栈中。
-
遍历完成后,栈中剩余的字符就是没有相邻重复字符的字符串。
为什么栈适合这种操作?
- 栈是一个 后进先出 的数据结构,每次处理字符时,都是与栈顶的字符进行比较。这样就能快速检测到相邻重复字符并进行删除。
算法实现:
python
复制代码
def solution(s: str) -> str:
stack = []
for char in s:
# 如果栈顶字符和当前字符相同,则弹出栈顶字符
if stack and stack[-1] == char:
stack.pop()
else:
# 否则将当前字符压入栈中
stack.append(char)
# 将栈中的字符拼接成最终字符串并返回
return ''.join(stack)
代码解析:
-
初始化栈:
- 我们使用一个空的栈
stack来存储字符。
- 我们使用一个空的栈
-
遍历字符串:
-
对于字符串中的每个字符
char:- 如果栈不为空,并且栈顶的字符和当前字符相同,说明找到了相邻的重复字符,弹出栈顶字符。
- 如果栈为空或者栈顶字符和当前字符不同,则将当前字符压入栈中。
-
-
返回结果:
- 遍历完字符串后,栈中的字符即为没有重复项的结果。我们将栈中的字符通过
''.join(stack)拼接成一个字符串并返回。
- 遍历完字符串后,栈中的字符即为没有重复项的结果。我们将栈中的字符通过
示例运行:
python
复制代码
# 示例1
print(solution("abbaca")) # 输出:"ca"
# 示例2
print(solution("azxxzy")) # 输出:"ay"
# 示例3
print(solution("a")) # 输出:"a"
时间复杂度分析:
- 时间复杂度是 O(n),其中 n 是字符串
s的长度。我们只遍历一次字符串,并且每个字符的栈操作(压入和弹出)都是 O(1)。
空间复杂度分析:
- 空间复杂度是 O(n),其中 n 是字符串的长度。最坏情况下(没有任何重复字符),栈可能会存储所有的字符。