返回

131. 分割回文串:巧用回溯法,拆解复杂问题

闲谈

回溯法概述

回溯法是一种试错的算法,它通过生成一组候选解,然后系统地检查这些解,最终找到所有满足条件的解。它通常用于解决需要枚举所有可能性的问题。

回溯法解决131. 分割回文串

  1. 定义子问题:

    将字符串s分割成回文子串的问题可以分解成若干个子问题:

    • 给定字符串s的前缀字符串s[0:i],找到所有可能的回文子串分割方案。
  2. 确定递归关系:

    假设我们已经找到了字符串s的前缀字符串s[0:i]的所有可能回文子串分割方案,那么我们可以通过以下步骤扩展这些方案,得到字符串s的前缀字符串s[0:i+1]的所有可能回文子串分割方案:

    • 如果s[i]是一个回文串,那么我们可以将s[i]作为一个独立的回文子串,将s[0:i]的回文子串分割方案与s[i]连接起来。
    • 如果s[i:i+1]是一个回文串,那么我们可以将s[i:i+1]作为一个独立的回文子串,将s[0:i]的回文子串分割方案与s[i:i+1]连接起来。
  3. 确定终止条件:

    当我们到达字符串s的末尾时,我们已经找到了所有可能的回文子串分割方案,可以终止递归。

  4. 回溯过程:

    我们从字符串s的第一个字符开始,使用回溯法递归地构造所有可能的回文子串分割方案。当我们到达字符串s的末尾时,我们将当前的回文子串分割方案添加到结果列表中,然后回溯到前一个状态,继续构造其他可能的回文子串分割方案。

示例代码

def partition(s):
  """
  :type s: str
  :rtype: List[List[str]]
  """
  result = []
  path = []

  def backtrack(start):
    if start == len(s):
      result.append(path.copy())
      return

    for end in range(start + 1, len(s) + 1):
      substring = s[start:end]
      if is_palindrome(substring):
        path.append(substring)
        backtrack(end)
        path.pop()

  backtrack(0)
  return result


def is_palindrome(s):
  """
  :type s: str
  :rtype: bool
  """
  return s == s[::-1]

总结

回溯法是一种强大的算法,可以用来解决各种各样的问题。131. 分割回文串就是一个典型的回溯问题。通过使用回溯法,我们可以系统地枚举所有可能的回文子串分割方案,并找到所有满足条件的解。