首先回文字串可以記憶成對稱形式的字串,例如:efe,abba,即正讀和反讀都一樣的字串。
分割字串有很多種可能所以單純遍歷一次字串並不能達到所有可能效果,
因此我們採用兩個容器res和path來獲取最終結果,path路徑為一種分割方式得到的結果,
而res則為所有分割方式得到的最終的結果,遍歷的方式採用遞迴方式。
例如:字串a'a'b,需要兩次遍歷得到兩種分割結果,
所以第一次得到的分割結果[[「a」,「a」,「b」]]依次存入path中後,分割結束後,
將結果存入res中,path彈出所有資料,進行第二次分割得到結果["aa","b"],
依次存入path,分割結束後,結果存入res,最後輸出res中的資料即為所有可能結果。
上圖中每一條路徑為path,代表著一種分割方式,所有結果最終存入res中
// **
#include
#include
#include
#include
#include
using namespace std;
class
solution);
return res;
}static
void
backtrack
(string s, vector>
& res, vector path)
for(int i =
1; i <= s.
size()
; i++)}
}static bool ispalindrome
(string s)
return
true;}
};
測試用例搜尋列印二位陣列即可。 Leetcode 131 分割回文串(回溯法)
這道題感覺應該能算上hard難度的題目了。因為題目要求是求出所有可能的分割方案,因此一般考慮暴搜。根據題意,每種方案需要切分完的每個子串都是回文串,所以在搜尋時後面,相應結果應該建立在前面已分割出符合要求的回文串的基礎上,如果後面的分割情況無法滿足題意,需要推倒之前的搜尋結果重來,這是具有明顯回溯性...
LeetCode 回溯 分割回文串
給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b 由於是求所有可能分割情況,所以使用回溯來做。如下 class solution vector ans vectorcur int start 0 dfs s,...
131分割回文串
回溯 res tmp def ispalindrome self,s str 判斷是否是回文串 return s s 1 def dfs self,s str param s param index 初始為0 return if 0 len s 遞迴終止條件,在res中儲存tmp的複製值 tmp.c...