Palindrome Partitioning 题解

题目来源: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"]
]

解题思路:

直接暴力解决

枚举每种可能,去判读是否回文。跟排列组合算法一样。 还可以优化,把中间的某个子串是否回文用hash缓存下来。

    bool isPalindrome(string s)
    {
        int n = s.length();
        if(n <= 1) return true;
        int left = 0; int right = n-1;
        while(left < right)
        {
            if(s[left] == s[right])
            {
                left++;
                right--;
            }else
                return false;
        }
        return true;
    } 
    void search(vector<string> &path, int start, string s, vector<vector<string> > &result)
    {
        int n = s.length();
        if(start > n) return;
        if(start == n) 
        {
            result.push_back(path);
            return;
        }
        for(int i = start; i < n; i++)
        {
            string str = s.substr(start, i-start+1);
            if(isPalindrome(str))
            {
                path.push_back(str);
                search(path, i+1, s, result);
                path.pop_back();
            }
        }
    }
    vector<vector<string>> partition(string s)
    {
        vector<vector<string> > result;
        vector<string> path;
        search(path, 0, s, result);
        return move(result);
    }

利用动态规划 O(n^2)

dp[i:j]表示s[i:j]是回文, 如果s[i] == s[j] and dp[i+1, j-1],满足条件, 则dp[i:j]就是回文。 注意要先算dp[i+1][j-1],所以循环的顺序。

其实像上面那样把每一个回文子串找出来后,就不用像排列组合那样去搜索了,可以直接构造。这个参考了leetcode-cppresult[i] 表示s[i:n]构成的回文串拆分结果。再走一遍dp就可以构造出来。方法如下: result[i]的结果为当前的回文串 插入每一个 result[i+1]构成。

Last updated

Was this helpful?