題目:https://oj.leetcode.com/problems/palindrome-partitioning/
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"
,
Return
[ ["aa","b"], ["a","a","b"] ]題目意思是對給定的一個字符串進行分割並保證分割後的子串都是迴文,返回所有可能的結果。
可以用DFS + 回溯的方法來解這道題。
通過遞歸依次遍歷子串。如果從開始到pos位置的子串是迴文,暫時保存該答案到中間結果vecStr中(遞歸返回時要記得彈出該子串進行回溯),並繼續遞歸判斷從pos+1開始到最後的子串。如果深搜到字符串末尾則表明一次深搜完成,得到一個分割答案。
AC代碼:
class Solution {
public:
vector<vector<string> > partition(string s) {
//res保存最終結果
vector<vector<string> > res;
//vecStr保存一次分割的中間結果
vector<string> vecStr;
makePartition(res,vecStr,s,0);
return res;
}
private:
//迴文分割函數
void makePartition(vector<vector<string> >& res,vector<string>& vecStr,string& s,int start){
if(start < s.size()){
int pos = start;
while(pos < s.size()){
if(isPalindrome(s,start,pos)){
//如果從start開始到pos的子串是迴文,則加入oneAns答案中
vecStr.push_back(s.substr(start,pos - start + 1));
//往下繼續分割
makePartition(res,vecStr,s,pos + 1);
//回溯
vecStr.pop_back();
}
++pos;
}
}
else{
//如果深搜到達字符串末尾,則表明一次分割完成
//將這次分割結果加入最後結果之中
res.push_back(vecStr);
}
}
//判斷是否是迴文的函數
bool isPalindrome(string s,int begin,int end){
while(begin < end){
if(s[begin] != s[end]) return false;
else{
begin++;
end--;
}
}
return true;
}
};