返回

拨开退格迷雾,比较字符串异同

见解分享

LeetCode每日一题:比较含退格的字符串(No.844)



如今,键盘随处可见,以致于退格键显得微不足道。然而,它在文字处理中却扮演着重要角色。退格键可以删除当前光标左边的字符,而这正是其神奇之处。

当比较两个字符串时,我们自然而然地会将它们逐个字符进行比较。但在字符串中加入退格键后,情况就变得复杂起来了。我们该如何比较两个包含退格键的字符串呢?

例如,字符串 "ab#c" 表示 "ac",因为退格键 "#" 删除了 "b"。字符串 "abc##d#" 表示 "ad",因为退格键 "#" 连续删除了 "c" 和 "b"。

比较含退格的字符串的本质是比较它们对应的有效字符串。所谓有效字符串,是指不含任何退格键的字符串。我们可以通过模拟键盘输入的方式,逐个字符地构建有效字符串。

首先,我们定义两个指针分别指向两个字符串的开头。然后,我们同时遍历两个字符串。当遇到非退格键字符时,我们将其添加到有效字符串中。当遇到退格键字符时,我们将其忽略,并回退有效字符串指针,使其指向最后一个非退格键字符。

最终,当两个字符串都遍历完毕后,我们比较两个有效字符串是否相等。如果相等,则两个含退格的字符串也相等。否则,两个含退格的字符串不相等。




以下是具体步骤:

  1. 定义两个指针分别指向两个字符串的开头。
  2. 同时遍历两个字符串。
  3. 当遇到非退格键字符时,将其添加到有效字符串中。
  4. 当遇到退格键字符时,将其忽略,并回退有效字符串指针,使其指向最后一个非退格键字符。
  5. 当两个字符串都遍历完毕后,比较两个有效字符串是否相等。
  6. 如果相等,则两个含退格的字符串也相等。
  7. 否则,两个含退格的字符串不相等。

以下是 Python 代码实现:

def compare_strings_with_backspace(s1, s2):
  """
  比较两个包含退格键的字符串是否相等。

  参数:
    s1 (str): 第一个字符串。
    s2 (str): 第二个字符串。

  返回:
    bool: 如果两个字符串相等,则返回 True,否则返回 False。
  """

  # 定义两个指针分别指向两个字符串的开头。
  i = 0
  j = 0

  # 定义两个有效字符串。
  valid_s1 = ""
  valid_s2 = ""

  # 同时遍历两个字符串。
  while i < len(s1) or j < len(s2):
    # 当遇到非退格键字符时,将其添加到有效字符串中。
    if s1[i] != "#" and s2[j] != "#":
      valid_s1 += s1[i]
      valid_s2 += s2[j]

    # 当遇到退格键字符时,将其忽略,并回退有效字符串指针,使其指向最后一个非退格键字符。
    elif s1[i] == "#" and i > 0:
      valid_s1 = valid_s1[:-1]
      i -= 1
    elif s2[j] == "#" and j > 0:
      valid_s2 = valid_s2[:-1]
      j -= 1

    # 移动指针。
    i += 1
    j += 1

  # 比较两个有效字符串是否相等。
  return valid_s1 == valid_s2