美文网首页北美程序员面试干货
LeetCode 131 [Palindrome Partiti

LeetCode 131 [Palindrome Partiti

作者: Jason_Yuan | 来源:发表于2016-07-07 16:35 被阅读346次

    原题

    给定一个字符串s,将s分割成一些子串,使每个子串都是回文串。
    返回s所有可能的回文串分割方案。

    样例
    给出 s = "aab",返回

    [
      ["aa", "b"],
      ["a", "a", "b"]
    ]
    

    解题思路

    • 求所有答案,首先排除动态规划,应该是DFS (Palindrome Partitioning II 求个数才是动归)
    • 遇到要求所有组合、可能、排列等解集的题目,一般都是DFS + backtracking
    • 首先传入s="aab" path=[] res = [], 首先切割出"a"(然后是"aa" "aab" ...),然后判读它是不是回文串:
    • 如果不是,直接跳过
    • 如果是,则此时剩余的 s="ab", path += ["a"]
    • 写入res的判断是,当s=""时,记录结果
    • 优化:可以通过用DP来计算任意s[i:j]是否是回文,并保存结果,再执行DFS,如果发现某条string不是回文,就可以直接退出,从而减少计算量

    完整代码

    class Solution(object):
        def partition(self, s):
            """
            :type s: str
            :rtype: List[List[str]]
            """
            if not s:
                return [[]]
            path = []
            result = []
            self.helper(s, path, result)
            return result
            
        def helper(self, str, path, result):
            if not str:
                result.append(path)
            for i in range(1, len(str) + 1):
                prefix = str[:i]
                if self.isPalindrome(prefix):
                    self.helper(str[i:], path + [prefix], result)
            
        def isPalindrome(self, str):
            for i in range(len(str)):
                if str[i] != str[len(str) - i - 1]: return False
            return True
    

    相关文章

      网友评论

        本文标题:LeetCode 131 [Palindrome Partiti

        本文链接:https://www.haomeiwen.com/subject/fzjljttx.html