leetcode-131-分割回文串

题目描述:

 

第一次提交:

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        temp = []
        def backtrack(s,temp):
            if not s:
                res.append(temp)
            for i in range(1,len(s)+1):
                if helper(s[:i]):
                    backtrack(s[i:],temp+[s[:i]])
        def helper(s):
            if len(s) == 1:
                return True
            i, j = 0, len(s) - 1
            while i < j:
                if s[i] != s[j]:
                    return False
                i += 1
                j -= 1
            return True
        backtrack(s,[])
        return res

 优化:

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        temp = []
        def backtrack(s,temp):
            if not s:
                res.append(temp)
            for i in range(1,len(s)+1):
                if s[:i][::-1] == s[:i]:
                    backtrack(s[i:],temp+[s[:i]])
        backtrack(s,[])
        return res

 方法二:动态规划+dfs

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        dp = [[False] * n for _ in range(n)]

        for i in range(n):
            for j in range(i + 1):
                if (s[i] == s[j]) and (i - j <= 2 or dp[j + 1][i - 1]):
                    dp[j][i] = True
        #print(dp)
        res = []

        def helper(i, tmp):
            if i == n:
                res.append(tmp)
            for j in range(i, n):
                if dp[i][j]:
                    helper(j + 1, tmp + [s[i: j + 1]])

        helper(0, [])
        return res

 

posted @ 2019-07-16 13:41  oldby  阅读(308)  评论(0编辑  收藏  举报