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; } };