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个字符串本身是个回文字符,那么只需要求解后面的子字符的回文串即可,于是这个问题被分解成了一个更小的问题。这道题更像一个分治法的题,将问题规模不断缩小,当然的遍历字符串的过程中需要进行回溯。
除了需要一个进行递归的辅助函数外,还需要定义一个判断一个字符串是否是回文字符串的辅助函数,程序的逻辑非常简单。
这道题和Combination Sum 比较类似,一开始看到这道题时完全感觉无从下手,但是在纸上写几个测试用例,从特殊的测试用例中就可以发现规律了。加上回溯后的递归都没有那么一目了然,可能有测试用例会更容易懂一些。
Runtime: 11 ms
class Solution { public: vector<vector<string>> partition(string s) { vector<vector<string>> ans; //if(s.size()==0) return ans; vector<string> tmp; helper(s,0,ans,tmp); return ans; } void helper(string s,int pos,vector<vector<string>> &ans,vector<string> &tmp) { if(pos==s.size()) { ans.push_back(tmp); return ; } for(int i=pos;i<=s.size()-1;i++) { if(ispalindrome(s.substr(pos,i-pos+1))) { tmp.push_back(s.substr(pos,i-pos+1)); helper(s,i+1,ans,tmp); tmp.pop_back(); } } } bool ispalindrome(string x) { int l=0; int r=x.size()-1; while(l<r) { if(x[l]!=x[r]) return false; l++; r--; } return true; } };