classSolution: defpartition(self, s: str) -> List[List[str]]: n = len(s) # 動態規劃,預處理出所有子字串是否為回文 is_palindrome = [[False] * n for _ inrange(n)] # is_palindrome[i][j] is True if s[i:j+1] is palindrome for i inrange(n): is_palindrome[i][i] = True for k inrange(2, n + 1): # 枚舉長度 for i inrange(n - k + 1): # 枚舉起點 j = i + k - 1# 對應的終點 if s[i] == s[j]: # 頭尾相同,若 長度為2 或 內部也是回文(從 is_palindrome[i+1][j-1] 轉移) ,則是回文 if k == 2or is_palindrome[i + 1][j - 1]: is_palindrome[i][j] = True # 回溯,枚舉所有可能的分割 ans = [] path = [] defdfs(i: int) -> None: # backtracking if i == n: ans.append(path[:]) # copy path return for j inrange(i, n): # 枚舉終點 if is_palindrome[i][j]: path.append(s[i:j+1]) dfs(j + 1) # path.pop() dfs(0) # 起點從0開始 return ans