1. 程式人生 > >LeetCode131:Palindrome Partitioning

LeetCode131:Palindrome Partitioning

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