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;
}
};
浙公网安备 33010602011771号