返回

巧用栈结构,轻松比较含退格的字符串

前端

前言

哈喽,大家好,我是你们的老朋友——挨打的阿木木。作为一名算法爱好者,我发现 leetcode 上有一道很有趣的题目,叫做「844. 比较含退格的字符串」。这道题乍一看似乎有些复杂,但只要我们掌握了栈数据结构的使用技巧,就能轻松搞定它。所以,今天我们就一起来研究一下这道题,并在此过程中学习如何巧妙地运用栈来处理字符串。

题目

给你两个字符串 s 和 t,它们都可能包含退格字符 '#’。其中,退格字符表示它前面相邻的非退格字符(如果存在的话)将被删除。
如果最终剩下的两个字符串相等,返回 true;否则,返回 false。

算法步骤

  1. 初始化两个栈来存储字符串 s 和 t

    stack_s = []
    stack_t = []
    
  2. 遍历字符串 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()
    
  3. 比较两个栈中的字符

    while stack_s and stack_t:
        if stack_s[-1] != stack_t[-1]:
            return False
        stack_s.pop()
        stack_t.pop()
    
  4. 如果两个栈都为空,则说明字符串 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

结语

通过今天的学习,我们不仅掌握了如何运用栈数据结构来比较含退格的字符串,而且还对栈的应用场景有了更深入的了解。希望大家能够举一反三,将栈应用到更多实际问题中去。如果您有任何算法方面的疑问,欢迎随时与我交流。我是挨打的阿木木,我们下期再见!