LeetCode131:Palindrome Partitioning
阿新 • • 發佈:2017-08-18
helper pat each leetcode1 example int () addclass 遍歷字符串
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”]
]
最開始看到這道題時毫無思路。可能是看到回文就怕了。也想不出怎樣用回溯來求解。
於是在紙上隨便亂畫了一些,結果發現好像能夠依照這個思路求解了,簡直囧啊。
對於上面的”aab”作為輸入。能夠這麽尋找回文:
“a”+”ab”構成的回文串
“aa”+”b”構成的回文串
“aab”不是回文。所以直接退出。
於是感覺對於一個字符串,能夠對這個字符串進行遍歷,假設前pos個字符串本身是個回文字符。那麽僅僅須要求解後面的子字符的回文串就可以,於是這個問題被分解成了一個更小的問題。
這道題更像一個分治法的題,將問題規模不斷縮小,當然的遍歷字符串的過程中須要進行回溯。
除了須要一個進行遞歸的輔助函數外。還須要定義一個推斷一個字符串是否是回文字符串的輔助函數。程序的邏輯很easy。
這道題和Combination Sum 比較相似,一開始看到這道題時全然感覺無從下手,可是在紙上寫幾個測試用例,從特殊的測試用例中就能夠發現規律了。加上回溯後的遞歸都沒有那麽一目了然,可能有測試用例會更easy懂一些。
runtime:20ms
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> path;
vector<vector<string>> result;
helper(s,0,path,result);
return result;
}
void helper(string s,int pos,vector<string > & path,vector<vector<string>> & result)
{
if(pos==s.size())
{
result.push_back(path);
return ;
}
for(int i=pos;i<s.size();i++)
{
if(isPalindrome(s.substr(pos,i-pos+1)))
{
path.push_back(s.substr(pos,i-pos+1));
helper(s,i+1,path,result);
path.pop_back();
}
}
}
bool isPalindrome(string s)
{
int first=0;
int end=s.size()-1;
while(first<end)
{
if(s[first++]!=s[end--])
return false;
}
return true;
}
};
LeetCode131:Palindrome Partitioning