leetcode131.分割回文串

题目:给你一个字符串 s,请你将 **s **分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。

示例 1

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2

输入:s = "a"
输出:[["a"]]

方法:回溯。
回溯的过程是遍历一个树的过程,分为横向遍历与纵向遍历,在回溯算法中for循环对应横向遍历,递归对应着纵向遍历。这题中,横向遍历中,需要不断尝试在不同的位置切分字符串,

算法思路

     计算计算串总长度 s_l = len(s)

  1. 横向遍历;start_index为子串(s)的第一个字符索引,横向遍历从左往右不断尝试切分位置,将字符串切分成s1与s2,若s1是回文串,则执行纵向搜索,递归对s2执行横向遍历,否则尝试新的切分位置。(这里如果切下来的s1不是回文串,则已经不满足题目要求,所以无需对s2再做切分,所以直接寻找新的切分位置。)
  2. 纵向遍历;对s的子串s2执行横向遍历;
  3. 返回逻辑;当start_index等于s_l了。第一,说明满足暂存的多个字符串都满足回文串要求。第二,说明字符串切分已经切分完了,所以可以将这一结果放到结果序列里。

代码

class Solution(object):
    def partition(self, s):
        """
        :type s: str
        :rtype: List[List[str]]
        """
        paths = []
        path = []
        s_l = len(s)

        def backtrack(start_index):
            if start_index == s_l:
                paths.append(path[:])
            else:
                for i in range(start_index, s_l):
                    tmp = s[start_index:i+1]
                    if tmp == tmp[::-1]:    # 判断是否为回文数
                        path.append(tmp)
                        backtrack(i+1)
                        path.pop()
        backtrack(0)
        return paths

你可能感兴趣的:(python,leetcode,数据结构)