【題目】
給定乙個字串str,返回把str全部切成回文子串的最小分割數。
【舉例】
str = 「aba」,str本身就是回文串,返回0.
str = 「acdcdcdad」,最少需要切兩次變成3個回文子串,所以返回2.
【基本思路】
本題是乙個經典的動態規劃的題目。定義動態規劃陣列dp,dp[i]的含義是子串str[0…i]至少需要切割幾次,才能把str[0…i]全部切成回文子串。那麼dp[len-1]就是最後的結果。
從左往右依次計算dp[i]的值,i 初始為0,具體計算過程如下:
1、假設 j 處在 0 到 i 之間,如果str[j…i]是回文串,那麼dp[i]的值可能是dp[j-1] + 1,其含義是在str[0…i]上,既然str[j…i]是回文串,那麼它可以自己作為乙個分割的部分,剩下的部分str[0…j-1]繼續做最經濟的分割,也就是dp[j-1]的值。
2、根據步驟1的方式,讓 j 在 i 到 0 的位置上列舉,那麼所有可能中最小值就是dp[i]的值,即dp[i] = min。
3、如何快速方便的判斷str[j…i]是否為回文串?
1)定義乙個二維陣列p,如果p[j][i]為true,表示str[j…i]是回文串,否則不是。在計算dp過程中,希望能夠同步、快速的計算出矩陣p。
2)p[j][i]如果為true,一定來自以下三種情況:
<1> str[j][i]由乙個字元組成
<2> str[j][i]由兩個字元組成且兩個字元相等
<3> str[j][i]由多個字元組成,str[j] == str[i]且p[j+1][i-1] == true。
3)在計算dp陣列的過程中,位置i是從左向右依次計算的。而對於每乙個i來說,又依次從 i 位置向左遍歷所有的位置,以此來決策dp[i]。所以對於p[j][i]來說,p[j+1][i-1]一定已經計算過。
從後往前遍歷str也是可以的,原理同上,詳情見**,這麼做下標理解起來可能更容易一點。
下面是使用python3.5實現的**。
#回文最小分割數
#從前往後遍歷
defmincut
(str1):
if str1 == none
or str1 == "":
return
0 n = len(str1)
p = [[false
for i in range(n)] for j in range(n)]
dp = [0
for i in range(n)]
for i in range(n):
dp[i] = sys.maxsize
for j in range(i, -1, -1):
if str1[j] == str1[i] and (i-j < 2
or p[j+1][i-1]):
p[j][i] = true
dp[i] = min(dp[i], 0
if j-1 == -1
else dp[j-1] + 1)
return dp[-1]
#從後往前遍歷
defmincut2(str1):
if str1 == none
or str1 == "":
return
0 n = len(str1)
dp = [0
for i in range(n)]
p = [[false
for i in range(n)] for j in range(n)]
for i in range(n-1, -1, -1):
dp[i] = sys.maxsize
for j in range(i, n):
if str1[i] == str1[j] and (j-i < 2
or p[i+1][j-1]):
p[i][j] = true
dp[i] = min(dp[i], 0
if j+1 == n else dp[j+1] + 1)
return dp[0]
動態規劃 回文串最小分割數
題目 給定乙個字串str,返回把str全部切成回文子串的最小分割數。舉例 str aba 不需要切割,返回0 str acdcdcdad 最少需要切兩次,比如 a cdcdc dad 所以返回2.解題思路 動態規劃 狀態定義 dp i 表示子串 0,i 的最小回文切割數,則最優解在dp s.leng...
回溯 分割字串使得每個部分都是回文數
131.palindrome partitioning medium for example,given s aab return aa b a a b 題目描述 給定乙個字串,將其分割成回文串,並返回所有的分割結果。思路分析 求子串問題,也可以用到回溯思想,我們只需要判斷分割出來的字串是否是回文,...
mysql分割字串 mysql分割字串
專案有通過一批id去過濾結果的需求,因為這個id是從其他平台拉下來的excel,為了避免加引號逗號的麻煩,在mysql儲存過程裡面拼接。在此做個記錄。很多地方用得上。1.通過某個字元,分割字串的函式。輸入分別為f string 待分割字串 f delimiter 分割字元 f order 取的字串的...