Leetcode 131 分割回文串(回溯法)

2021-10-21 12:22:14 字數 1388 閱讀 1675

這道題感覺應該能算上hard難度的題目了。因為題目要求是求出所有可能的分割方案,因此一般考慮暴搜。根據題意,每種方案需要切分完的每個子串都是回文串,所以在搜尋時後面,相應結果應該建立在前面已分割出符合要求的回文串的基礎上,如果後面的分割情況無法滿足題意,需要推倒之前的搜尋結果重來,這是具有明顯回溯性質的一種情形。

本題的難點在於如何用**實現這個搜尋過程。由於結果相當於二維列表,所以在一次搜尋中直接向下傳的應該就是列表,在一種方案搜尋完後將這次搜尋到的所有結果加入到結果列表中。在一開始時我的回溯核心函式dfs是直接用列表做的引數,由於列表是可變物件,在其作為函式引數時會根據函式中的運算而改變對應的值。因此這種寫法需要注意在把當前方案加入答案陣列時需要將當前列表的深拷貝的備份加入,而不是直接將列表本身加入,否則在後續搜尋中已經加入答案的結果會發生變化。

class solution:

def partition(self, s: str) -> list[list[str]]:

ans=

def dfs(temps,templist):

nonlocal ans

if len(temps)==0:

anslist=copy.deepcopy(templist) #注意這裡,需要將深拷貝的結果存到答案中

return

n=len(temps)

for i in range(n):

l=0r=i

flag=true

while l另外一種更高效的方法是直接生成不命名的新陣列作為後續遞迴函式的引數,這樣就可以避免之前的問題,同時也不需要像回溯法的標準模板中那樣先加入當前陣列,再彈出。

class solution:

def partition(self, s: str) -> list[list[str]]:

ans=

def dfs(temps,templist):

nonlocal ans

if len(temps)==0:

return

n=len(temps)

for i in range(n):

l=0r=i

flag=true

while l

if temps[l]==temps[r]:

l+=1

r-=1

else:

flag=false

break

if flag:

dfs(temps[i+1:],templist+[temps[:i+1]]) #注意這裡引數的寫法

dfs(s,)

return ans

Leetcode131 分割回文串

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b public list partition string s partition s,0 new arraylist res return res index...

LeetCode 131 分割回文串

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b 思路 回溯法 注意回溯的位置 class solution object def partition self,s type s str rtype list...

LeetCode 131 分割回文串

返回 s 所有可能的分割方案。分析 首先要用動態規劃來標記出回文子串的位置,dp i j true表示字串i到j是回文。因此動態規劃判斷時候是用的 dp i j s i s j len 3 dp i 1 j 1 表示當len 3時候只需要判斷兩個端點,其他時候還要判斷中間是否是回文子串。然後使用回溯...