字串問題 回文最小分割數

2021-08-07 11:03:04 字數 2122 閱讀 8419

【題目】

給定乙個字串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 取的字串的...