[LeetCode]题解(python):131-Palindrome Partitioning

题目来源:

  https://leetcode.com/problems/palindrome-partitioning/


 

题意分析:

  给定一个字符串s,将s拆成若干个子字符串,使得所有的子字符串都是回文字符串,返回所有这样的子字符串集合。比如s = “aab”,那么返回[["aa","b"],["a","a","b"]]。


 

题目思路:

  这是一个动态规划问题,如果s[:i]是回文字符串,那么s[:i] X solve(s[i+1:]),(X是笛卡尔乘积,solve(s[i+1:])是s[i+1:]的答案)。所以只需要判断s[:i]是不是回文就可以了。


 

代码(python):

 1 class Solution(object):
 2     def partition(self, s):
 3         """
 4         :type s: str
 5         :rtype: List[List[str]]
 6         """
 7         m = len(s)
 8         if m == 0:
 9             return []
10         def isp(i,j):
11             while i < j:
12                 if s[i] != s[j]:
13                     return False
14                 i += 1
15                 j -= 1
16             return True
17         def solve(i):
18             ans = []
19             if i == m - 1:
20                 return [[s[i]]]
21             j = i
22             while j < m:
23                 if isp(i,j):
24                     tmp = solve(j + 1)
25                     if len(tmp) == 0:
26                         ans.append([s[i:j + 1]])
27                     else:
28                         for k in tmp:
29                             ans.append([s[i:j + 1]] + k)
30                 j += 1
31             return ans
32         return solve(0)
33                     
34                     
View Code

 

posted @ 2016-03-28 21:12  Ry_Chen  阅读(336)  评论(0编辑  收藏  举报