C 動態規劃問題(1) 分割回文串

2021-10-21 18:03:33 字數 1064 閱讀 1723

本例以把任意乙個字元分割成一些子串,使每個子串都是回文串,並且輸出最小分割次數為例:

以字串aabc為例:

首先利用中心擴散法判斷是回文字串的區間,(回文字串的判斷另一篇文章中有詳解),

首先,dp的定義是從s[0]到當前字元s[i]分割字串所需的最少次數,

那麼,當0-i區間是回文串時dp[i]為0,所以aabc,a和aa均是回文串,

所以dp[0],dp[1]均為0,接著若某一區間不是回文串,那我們先設乙個最大分割次數即mindiv=i,

例如aab這三個字元,此時i=2,他們分割的最大次數是2次即分割成乙個乙個的字元,

接著若在這個區間找到乙個區間假設為[j+1]至[i]區間為回文串,

那麼我們是不是可以發現0-i區間分割的最小次數=前面j個字元分割的最小次數+1,即dp[i]=mindiv+1;

以aabc為例前三個字元最少分割次數為2,此時我們發現[3][3]區間即c為回文串,那麼aabc最少分割次數是不是等於前面三個aab最少分割次數+1,因為發現回文串,分割只需要在回文串前面分割一下即可,

注意:中間mindiv=min(mindiv, dp[j])是為了確保中間發現兩個字元以上的回文串時,隨著j的變化始終保證mindiv指向整個回文串前的字串的最少分割次數,舉例『leeet』,前兩個最少分割次數為1,此時我們發現中間三個字元是回文串,那麼j分別指向第二三四位的時候我們的dp值應該保持不變始終為1,即始終等於dp[0]+1,也等於dp[1],

class

solution}}

static int mincut

(string s)

else

} dp[i]

= mindiv +1;

//dp[i]表示前i個字串分割最小次數}}

return dp[s.

size()

-1];}};

LeetCode 分割回文串II(動態規劃)

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。請先翻閱 leetcode 分割回文子串 此題就是在上一題將所有分割方法修改為最少的分割次數。方法一 回溯法。繼...

C 回溯法 1 分割回文串

首先回文字串可以記憶成對稱形式的字串,例如 efe,abba,即正讀和反讀都一樣的字串。分割字串有很多種可能所以單純遍歷一次字串並不能達到所有可能效果,因此我們採用兩個容器res和path來獲取最終結果,path路徑為一種分割方式得到的結果,而res則為所有分割方式得到的最終的結果,遍歷的方式採用遞...

131分割回文串

回溯 res tmp def ispalindrome self,s str 判斷是否是回文串 return s s 1 def dfs self,s str param s param index 初始為0 return if 0 len s 遞迴終止條件,在res中儲存tmp的複製值 tmp.c...