給定一個字符串 s,將 s 分割成一些子串,使每個子串都是迴文串。
返回 s 所有可能的分割方案。
示例:
輸入: "aab"
輸出:
[
["aa","b"],
["a","a","b"]
]
思路分析:運用遞歸回溯的思想,這道理毫無疑問是每一種可能性都要判斷,沒有什麼投機取巧的方法。所以我們採用遞歸的思想,關鍵是找到遞歸的思路。我們讓函數從字符串第index開始分割一個子串,長度爲i,再從第index+i處開始分割。所以遞歸的終止條件是index==子串的長度,這個時候已經不能再分割了。判斷的時候 要判斷分割出的子串是否是迴文字符串,這個比較簡單,如果是的話就把它存到結果裏,繼續分割,如果不是那麼就繼續尋找。要注意的是,將子串放進結果裏,後面的字符串找完之後還要pop_back()出來。
C++代碼如下:
class Solution {
vector<vector<string>> res;
//判斷是否是迴文字符串
bool isP(string a)
{
int len=a.size();
int l= 0 ;
int r= a.size()-1;
while(l<r)
{
if(a[l] != a[r])
{
return false;
}
l++;r--;
}
return true;
}
//從string[index]開始分割 out是分割結果
void part(string s, int index, vector<string>& out)
{
// cout<<s<<" "<<index<<" "<<out<<endl;
if(index == s.size())
{//沒有能分割的了
res.push_back(out);
return;
}
for(int i=index; i < s.size(); i++)
{
string subs = s.substr(index,i-index+1);
if(isP(subs))
{//是迴文的話
out.push_back(subs);
part(s,i+1,out);
out.pop_back();
}
}
}
public:
vector<vector<string>> partition(string s) {
res.clear();
if(s.size() == 0) return res;
vector<string> out;
part(s,0,out);
return res;
}
};