返回
巧用栈结构,轻松比较含退格的字符串
前端
2023-12-17 12:10:14
前言
哈喽,大家好,我是你们的老朋友——挨打的阿木木。作为一名算法爱好者,我发现 leetcode 上有一道很有趣的题目,叫做「844. 比较含退格的字符串」。这道题乍一看似乎有些复杂,但只要我们掌握了栈数据结构的使用技巧,就能轻松搞定它。所以,今天我们就一起来研究一下这道题,并在此过程中学习如何巧妙地运用栈来处理字符串。
题目
给你两个字符串 s 和 t,它们都可能包含退格字符 '#’。其中,退格字符表示它前面相邻的非退格字符(如果存在的话)将被删除。
如果最终剩下的两个字符串相等,返回 true;否则,返回 false。
算法步骤
-
初始化两个栈来存储字符串 s 和 t
stack_s = [] stack_t = []
-
遍历字符串 s 和 t,分别将每个字符推入对应的栈中
for char in s: if char != '#': stack_s.append(char) elif stack_s: stack_s.pop() for char in t: if char != '#': stack_t.append(char) elif stack_t: stack_t.pop()
-
比较两个栈中的字符
while stack_s and stack_t: if stack_s[-1] != stack_t[-1]: return False stack_s.pop() stack_t.pop()
-
如果两个栈都为空,则说明字符串 s 和 t 相等,返回 True;否则,返回 False
if not stack_s and not stack_t: return True else: return False
代码实现
def backspace_compare(s, t):
"""
比较两个可能包含退格字符 '#' 的字符串
参数:
s (str): 字符串 s
t (str): 字符串 t
返回:
bool: 如果最终剩下的两个字符串相等,返回 True;否则,返回 False
"""
# 初始化两个栈来存储字符串 s 和 t
stack_s = []
stack_t = []
# 遍历字符串 s 和 t,分别将每个字符推入对应的栈中
for char in s:
if char != '#':
stack_s.append(char)
elif stack_s:
stack_s.pop()
for char in t:
if char != '#':
stack_t.append(char)
elif stack_t:
stack_t.pop()
# 比较两个栈中的字符
while stack_s and stack_t:
if stack_s[-1] != stack_t[-1]:
return False
stack_s.pop()
stack_t.pop()
# 如果两个栈都为空,则说明字符串 s 和 t 相等,返回 True;否则,返回 False
if not stack_s and not stack_t:
return True
else:
return False
# 测试用例
print(backspace_compare("ab#c", "ad#c")) # True
print(backspace_compare("ab##", "c#d#")) # True
print(backspace_compare("a##c", "#a#c")) # True
print(backspace_compare("a#c", "b")) # False
结语
通过今天的学习,我们不仅掌握了如何运用栈数据结构来比较含退格的字符串,而且还对栈的应用场景有了更深入的了解。希望大家能够举一反三,将栈应用到更多实际问题中去。如果您有任何算法方面的疑问,欢迎随时与我交流。我是挨打的阿木木,我们下期再见!