LeetCode-Palindrome Partitioning II-回文分割-DP优化

https://oj.leetcode.com/problems/palindrome-partitioning-ii/

普通的DP很容易想到。但是复杂度为n^3会超时。

一个重要的优化是使用一个数组pm[i][j]来记录[i,j)这段子串是否为回文。这个pm不需要预计算,通过调整遍历f(i)之前子串的顺序可以在DP的过程中计算出。

利用特性:

若pm[i+1][j-1]=true,且s[i]==s[j]时,pm[i][j]也一定为true。

const int INF=9999;
class Solution {
public:
    int n,m;
    string s;
    vector <int> dp;
    vector<vector<int>> pm;
    int minCut(string s) {
        n=s.length();
        this->s=s;
        dp.resize(n+1,INF);
        dp[0]=0;
        pm.resize(n+1,vector<int>(n+1,0));
        for (int i=0;i<n;i++){pm[i][i]=true;pm[i][i+1]=true;}
        for (int i=1;i<=n;i++){
            for (int j=i-1;j>=0;j--){
                if (j==i-1){
                    if (s[j]==s[i-1]) dp[i]=min(dp[i],dp[j]+1);
                    continue;
                }
                if (s[j]==s[i-1] && pm[j+1][i-1]){
                    pm[j][i]=true;
                    dp[i]=min(dp[i],dp[j]+1);
                }
            }
        }
        return dp[n]-1;
    }
};

  

posted @ 2014-10-08 17:38  zombies  阅读(108)  评论(0编辑  收藏  举报