題目
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = "aab"
,
Return 1
since the palindrome partitioning ["aa","b"]
could
be produced using 1 cut.
解題思路
給一個字符串,如果字符串可以劃分成若干子迴文字符串,返回最小的劃分數量。
這個題如果還用之前求所有劃分組合的循環加遞歸方法的話,就會得到超時的錯誤。這是就要考慮別的方法,動態規劃倒是一個不錯的方法,但是動態規劃最重要的是要找到動態方程。
本題的動態方程:
dp[i] = min(dp[i], dp[j+1]+1)), i<=j<n;
dp[i] : 表示從 i 到串尾的最小劃分數。
代碼實現
class Solution {
public:
int minCut(string s) {
int n = s.size();
vector<int> dp(n+1, 0);
vector<vector<int> > imap(n+1, vector<int>(n+1, 0));
for(int i=n-1;i>=0; --i){
dp[i] = n-i;
for(int j=i; j<n; ++j){
if(s[i] != s[j]) continue;
if(j-i<2 || imap[i+1][j-1]==1){
imap[i][j] = 1;
dp[i] = min(dp[i], dp[j+1] +1);
}
}
}
return dp[0]-1;
}
};
另外,我開通了微信公衆號--分享技術之美,我會不定期的分享一些我學習的東西.