39 组合总和以及40 组合总和II已经在第21次打卡完成,看了讲解部分当作复习,不再赘述,今天的重点在于理解分割字符串的过程。
LeetCode 131 分割回文串
题目链接:131. 分割回文串 - 力扣(Leetcode)
分割型的回溯一直还不太能理解,主要问题是怎么表示切割线。“在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。”理解这一点之后,递归终止条件(收集结果)的时机才能确定:
class Solution:
def __init__(self):
self.result = []
self.path = []
def isPalindrome(self, s):
i, j = 0, len(s) - 1
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
def backtracking(self, s, startIndex, n):
if startIndex >= n:
self.result.append(self.path[:])
return
for i in range(startIndex, n):
if self.isPalindrome(s[startIndex: i + 1]):
self.path.append(s[startIndex: i+1])
else:
continue
self.backtracking(s, i+1, n)
self.path.pop()
def partition(self, s: str) -> List[List[str]]:
self.backtracking(s, 0, len(s))
return self.result