返回

力扣之逐项删除所有相邻相同字符(数组栈或字符串栈)

前端

序言:

在计算机科学领域,字符串操作是不可或缺的一部分。字符串的处理和操纵对于许多应用程序和算法至关重要。力扣网站上有一个广为流传的经典问题,要求删除字符串中所有相邻相同的字符。本文将深入探讨解决此问题的两种方法:数组栈和字符串栈。

问题

给定一个由小写字母组成的字符串 S,执行以下操作:

  • 每次选择字符串中相邻且相同的两个字符,并删除它们。
  • 重复此操作,直至无法继续删除为止。

返回执行所有删除操作后的最终字符串。

解决方案 1:数组栈

数组栈是一种简单易用的数据结构,可以用作此问题的解决方案。

算法步骤:

  1. 将字符串 S 转换为字符数组 arr
  2. 创建一个空栈 stack
  3. 对于数组 arr 中的每个字符 c
    • 如果 stack 为空或 stack 栈顶元素与 c 不同,则将 c 压入 stack
    • 否则,将 stack 栈顶元素和 c 出栈。
  4. stack 中的字符按序连接成字符串并返回。

示例代码(Python):

def remove_adjacent(s):
  """
  :type s: str
  :rtype: str
  """
  arr = list(s)
  stack = []
  for c in arr:
    if not stack or stack[-1] != c:
      stack.append(c)
    else:
      stack.pop()
  return "".join(stack)

解决方案 2:字符串栈

字符串栈是一种简单而优雅的方法来解决此问题。

算法步骤:

  1. 初始化一个空字符串 stack
  2. 对于字符串 S 中的每个字符 c
    • 如果 stack 为空或 stack 最后一个字符与 c 不同,则将 c 追加到 stack
    • 否则,将 stack 最后一个字符和 cstack 中移除。
  3. 返回 stack

示例代码(Python):

def remove_adjacent(s):
  """
  :type s: str
  :rtype: str
  """
  stack = ""
  for c in s:
    if not stack or stack[-1] != c:
      stack += c
    else:
      stack = stack[:-1]
  return stack

复杂度分析:

这两种方法的时间复杂度均为 O(n) ,其中 n 是字符串 S 的长度。这是因为它们都只对字符串进行了一次线性遍 Resin。空间复杂度也是 O(n) ,因为需要使用栈来存储字符。

总结:

数组栈和字符串栈都是解决力扣删除相邻相同字符问题的有效方法。两种方法的时间和空间复杂度均相同。选择哪种方法取决于个人喜好和问题要求。对于简单的字符串操作,字符串栈可能是一种更便捷的选择,因为它不需要使用额外的数组。但是,对于更复杂的情况,数组栈可能更容易扩展和实现。