Given a string s, partition s such that every substring of the partition is a palindrome.數組
Return all possible palindrome partitioning of s.函數
For example, given s = "aab"
,spa
Returncode
[ ["aa","b"], ["a","a","b"] ]
解題:blog
使用深刻優先搜索的思想;使用遞歸;遞歸
從頭i = 0開始遍歷字符串,找到知足要求的迴文列,將其放入結果列表中,繼續查找下面的迴文字符;字符串
解題步驟:string
一、主函數,創建返回的二維數組,創建存放結果的一維數組,調用遞歸函數;it
二、遞歸函數,輸入爲二維數組ret,一維數組path,字符串str,當前檢查到的index值:io
(1)若是index值已經等於str的長度,說明搜索完畢,將path插入ret中,返回;
(2)不然從i從index開始,遍歷到str末尾,找index~i範圍哪些是迴文串:
a. 將回文串摘出放入path中,更新index,繼續遞歸;
b. 從path中pop出放入的迴文串,繼續遍歷循環;
三、返回ret
代碼:
1 class Solution { 2 public: 3 vector<vector<string>> partition(string s) { 4 vector<vector<string> > ret; 5 if(s.empty()) 6 return ret; 7 8 vector<string> path; 9 dfs(ret, path, s, 0); 10 11 return ret; 12 } 13 14 void dfs(vector<vector<string> >& ret, vector<string>& path, string& s, int index) { 15 if(index == s.size()) { 16 ret.push_back(path); 17 return; 18 } 19 20 for(int i = index; i < s.size(); ++i) { 21 // find all palindromes begin with index 22 if(isPalindrome(s, index, i)) { 23 path.push_back(s.substr(index, i - index + 1)); 24 dfs(ret, path, s, i+1); 25 path.pop_back(); 26 } 27 } 28 } 29 30 bool isPalindrome(const string& s, int start, int end) { 31 while(start <= end) { 32 if(s[start++] != s[end--]) 33 return false; 34 } 35 return true; 36 } 37 };