Problem
Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s.
A palindrome string is a string that reads the same backward as forward.
Algorithm
DP + dfs. Use dp to calculate the palindrome state: s(L, R) = (s[L] == s[R] and s[L+1, R-1]); then use dfs to find all the segmentations.
Code
class Solution:
def partition(self, s: str) -> List[List[str]]:
sLen = len(s)
palindrome = [[0 for i in range(sLen+1)] for j in range(sLen+1)]
for L in range(1, sLen+1):
palindrome[L][L] = 1
palindrome[L][L-1] = 1
for l in range(2, sLen+1):
for L in range(1, sLen-l+2):
R = L+l-1
if s[L-1] == s[R-1] and palindrome[L+1][R-1]:
palindrome[L][R] = 1
ans = []
save = [""] * sLen
def dfs(i, e, d):
nonlocal save
if i == e:
ans.append(save[0:d])
return
for k in range(i, e):
if palindrome[i+1][k+1]:
save[d] = s[i:k+1]
dfs(k+1, e, d+1)
dfs(0, sLen, 0)
return ans