將一個字串s 切割成子串都是迴文,最小的切割次數
阿新 • • 發佈:2019-02-02
本題源自LeetCode
---------------------------------------------------------------------------------------
用動態規劃的思想
1 用一個dp陣列來儲存子串(0,i)的最小切割次數,則最優解在dp[str.length()-1].
2 如果當前子串是迴文則dp[i]=0;否則dp[i]=i;
3 對於i大於等於1 的子串,如果【0,i】不是迴文,如果s.substring(j,i+
1
)(j<=i,即遍歷i之前的每個子串)是迴文時,dp[i] = min(dp[i], dp[j-
1
]+
1
);
4 否則
s.substring(j,i+
1
)(j<=i)不是迴文時,dp[i] = min(dp[i],dp[j-
1
]+i+
1
-j);
int minCut(string s) { int len=s.length(); vector<int> dp(len,0); for(int i=0;i<len;i++){ dp[i]=IsPalindRome(s.substr(0,i+1)) ? 0 : i; if(dp[i]==0) continue; else{ for(int j=1;j<=i;j++){ if(IsPalindRome(s.substr(j,i-j+1))) dp[i]=min(dp[i],dp[j-1]+1); else{ dp[i]=min(dp[i],dp[j-1]+i-j+1); } } } } return dp[len-1]; } bool IsPalindRome(string str){ int end=str.length()-1; int start=0; while(start<end){ if(str[start]==str[end]){ start++; end--; }else{ return false; } } return true; }