问题描述:
小M拿到了一个由小写字母组成的字符串 s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在 s 上反复进行此操作,直到无法再删除任何字母。
请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。
测试样例
样例1:
输入:
s = "abbaca"
输出:'ca'
样例2:
输入:
s = "azxxzy"
输出:'ay'
样例3:
输入:
s = "a"
输出:'a'
问题简化:
对于这道题目,我们需要解决的问题是对一个字符串进行反复的操作,删除相邻且相同的字符。直到不能再进行删除为止,最后返回处理后的字符串。
解题思路:
通过简化问题后,很容易就看出了可以使用栈的“后进先出”特性来处理这种情况。
- 遍历字符串中的每个字符;
- 如果栈为空或当前字符与栈顶字符不同,则将当前字符压入栈中;
- 如果当前字符与栈顶字符相同,则弹出栈顶字符;
- 继续处理下一个字符;
- 重复以上步骤,直到字符串中没有可以删除的字符为止。
代码实现:
以下是使用python的具体实现及其代码解析:
1. 函数定义:
def solution(s: str) -> str:
2. 初始化栈:
stack = []
stack是一个空列表,用来存储字符。使用栈的后进先出(LIFO)特性来判断是否存在相邻的重复字符。- 此时,栈的作用类似于一个临时存储区,字符在其中“排队”,一旦出现重复字符,就可以弹出栈顶字符。
3. 遍历输入字符串:
for char in s:
- 遍历字符串
s中的每一个字符,从头到尾逐个处理字符串中的字符。
4. 判断当前字符与栈顶元素是否相同:
if stack and stack[-1] == char:
stack.pop()
stack and stack[-1] == char:stack判断栈是否为空。如果栈为空,则表示当前没有任何字符可以进行比较,跳过这个条件,执行stack.append(char)。stack[-1] == char判断栈顶元素是否与当前字符char相同。- 如果栈顶元素和当前字符相同,表示找到了一个相邻的重复字符。
stack.pop():- 如果找到了一个相邻的重复字符,就执行
stack.pop(),表示将栈顶元素弹出(即删除了这对相邻重复字符)。
- 如果找到了一个相邻的重复字符,就执行
5. 如果当前字符和栈顶字符不同:
else:
stack.append(char)
- 如果栈顶元素与当前字符不同(即没有找到相邻的重复字符),那么就将当前字符
char压入栈中。 - 即暂时保留当前字符,等待后续字符的比较。
6. 返回处理后的结果:
return ''.join(stack)
- 最后栈中存储的是删除相邻重复字符后的最终字符,通过
''.join(stack)将其合并成一个字符串并返回。
7. 主函数测试:(代码略)
总结
通过这道题,我对栈的使用更加得心应手。其实,最开始我对于这道题的解题思路仅仅停留在通过简单地遍历字符串或通过嵌套循环去删除字符,但,经过MarsCode的思路提示后,我发现了可以利用栈的方式来达到这道题删除相邻的相同字符的目的。
在这道题中,栈的使用帮助我高效且简洁地处理了相邻的相同字符:当遇到重复字符时,我们可以立即弹出栈顶的元素,这种即时的反应正是栈的优势所在。
同时,我也意识到了,很多涉及匹配、去重或括号配对的问题,其实都可以尝试使用栈来解决,栈对于这类问题能够快速地检查和处理最近的状态。