题目:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
- 输入:"abbaca"
- 输出:"ca"
- 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
- 1 <= S.length <= 20000
- S 仅由小写英文字母组成。
Python3代码实现:
class Solution:
def removeDuplicates(self, s: str) -> str:
# 定义一个列表res作为栈
res = list()
# 对输入字符串s中的每个元素item进行遍历
for item in s:
# 如果res不为空,并且res的栈顶元素与当前字符item相同
if res and res[-1] == item:
# 移除栈顶的重复元素
res.pop()
# 如果栈顶元素与当前字符不相同,或者栈为空
else:
res.append(item)
# 将列表中的res中的字符拼接成一个字符串进行返回
return "".join(res)
上述代码实现过程解释:
上述代码的目的是从一个字符串中移除所有相邻的重复字符,直到没有更多相邻重复的字符存在。实现过程如下:
-
定义一个列表
res
作为栈:res
是用来存储最终结果的字符的列表,同时也充当栈的角色,来帮助我们处理相邻重复的字符。
-
遍历输入字符串
s
:- 对输入字符串
s
中的每个字符item
进行遍历。
- 对输入字符串
-
检查并处理重复字符:
- 如果
res
不为空并且res
的最后一个元素(即栈顶元素)与当前字符item
相同:- 这意味着找到了一对相邻的重复字符。
- 使用
res.pop()
从res
中移除最后一个元素,即移除栈顶的重复字符。这样做是因为当前字符与栈顶字符重复,所以不需要将当前字符添加到栈中。
- 否则:
- 如果栈顶元素与当前字符不相同,或者栈为空,就将当前字符
item
添加到res
中,使用res.append(item)
。
- 如果栈顶元素与当前字符不相同,或者栈为空,就将当前字符
- 如果
-
返回处理后的字符串:
- 使用
"".join(res)
将列表res
中的字符拼接成一个字符串返回。 - 这个拼接操作将列表中的所有字符合并成一个连续的字符串,作为函数的最终输出。
- 使用
通过上述处理,任何连续出现的相同字符都会被删除。例如,对于字符串 "aabba"
,处理过程是:
- 遇到第一个
'a'
,res = ['a']
- 遇到第二个
'a'
,发现与栈顶相同,移除栈顶元素,res = []
- 遇到第一个
'b'
,res = ['b']
- 遇到第二个
'b'
,发现与栈顶相同,移除栈顶元素,res = []
- 遇到最后一个
'a'
,res = ['a']
最终结果为 "a"
,所有相邻的重复字符都被移除了。这种方法非常高效且直观,特别适用于需要多次消除重复字符的情况。
代码中的相关用法解释:
在 Python 中,"".join(res)
是一种常用的字符串拼接方法,这里的 ""
是一个空字符串,它作为连接符来将列表 res
中的所有元素合并成一个单一的字符串,详细解释如下:
"".join(iterable)
:join()
是一个字符串方法,用于将一个可迭代对象(如列表)中的元素连接成一个字符串。join()
方法的调用者是一个字符串,它被用作每个元素之间的分隔符。在这个例子中,调用者是一个空字符串""
,意味着在元素之间不插入任何字符或空格,直接将所有元素紧密连接起来。
例如,如果 res = ['h', 'e', 'l', 'l', 'o']
,那么执行 "".join(res)
将返回字符串 "hello"
,列表中的字符被顺序连接成了一个完整的字符串。
如果使用的是其他字符串作为连接符,例如 "-"
,那么 "-".join(['hello', 'world'])
将返回 "hello-world"
,这里的 "-"
被用作元素之间的分隔符。
在上述代码中,使用 "".join(res)
是为了将字符列表 res
转换成一个没有任何分隔符的连续字符串,这是处理字符串问题时的一个常用技术。
综上,本文的对于力扣1047. 删除字符串中的所有相邻重复项的Python3解答,仅仅是个人学习资料记录,也十分高兴我的见解可以帮助其他的正在做这个题目的同学,基础较差,仅仅是个人见解,大神勿喷,欢迎交流,谢谢!