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