题目描述
https://leetcode-cn.com/problems/palindrome-partitioning/
思路题解
dp[i]代表s[0~i]的字符串的回文子串是哪些。
我们求解的时候每次分成两部分,例如s=aaab:
- i=0时,dp[0]=[“a”]
- i=1时,dp[1]=[[“a”,“a”],[“aa”]] (其中[“a”,“a”]为上一步剩下的+s[i],[“aa”]为s[i]逐个往前收揽得到的)
- 以此类推…
输入:"aaab"
dp数组:
[['a']]
[['a', 'a'], ['aa']]
[['a', 'a', 'a'], ['aa', 'a'], ['aaa'], ['a', 'aa']]
[['a', 'a', 'a', 'b'], ['aa', 'a', 'b'], ['aaa', 'b'], ['a', 'aa', 'b']]
因此,dp[i]分为两部分:
- {dp[i-1]}+s[i]
- {s[0:i+1],s[1:i+1],…s[i-1:i+1]}+{dp[0~i-1:i+1]}
- ("{}"代表遍历)
class Solution:
def partition(self, s: str) -> List[List[str]]:
def isHuiWen(l,r):
while l<=r and s[l]==s[r]:
l+=1
r-=1
if l<=r:return False
return True
dp=[[] for i in range(len(s))]
dp[0]=[[s[0]]]
for i in range(1,len(s)):
for tmp in dp[i-1]:
dp[i].append(tmp+[s[i]])
for j in range(i):
if isHuiWen(j,i):
if j-1<0:
dp[i].append([s[j:i+1]])
else:
for tmp in dp[j-1]:
dp[i].append(tmp+[s[j:i+1]])
# print(dp)
return dp[-1]