C 檢測字串回文子串和回文子串行

2021-10-21 15:24:44 字數 1565 閱讀 9530

string

回文子串

回文子串行

}狀態表示f[i][j]表示下標區間是[i, j]範圍內的不同的回文子串行個數

狀態轉移

如果s[i] == s[j]:

f[i][j] = 2 * f[i+1][j-1] + 2

乘以2是內部的不同回文個數本身f[i+1][j-1]和套上左右邊界兩個字元後的不同回文個數f[i+1][j-1]

加上2是邊界上兩個相同字元組合起來可以形成長度是1和長度是2的兩個不同的回文

但是還要分類討論區間[i+1,j-1]有幾個等於s[i]的字元

[i+1,j−1]有1個等於s[i]s[i]的字元

f[i][j] = 2 * f[i+1][j-1] + 1

則此時加上的2裡長度是1的s[i]的情況在計算f[i+1][j-1]的時候已經計算過了,所以+2變成+1

[i+1,j-1]有≥2個等於s[i]s[i]的字元

f[i][j] = 2 * f[i+1][j-1] - f[l+1][r-1]

則此時加上的2裡長度是1的s[i]和長度是2的情況在計算f[i+1][j−1]的時候已經計算過了所以+2變成+0

同時分別從左i+1和右j−1找到第乙個等於s[i]的索引l和r

可以發現 s[l+1:r-1]與s[l]及s[r]及s[r]構成的所有情況會和

s[i+1:j-1]與s[i]及s[j]及s[j]構成的所有情況 重複

所以減去s[l+1:r-1]與s[i]和s[j]s[i]和s[j]構成的情況f[l+1][r-1]

如果s[i] != s[j]s[i]!=s[j]:容斥原理,此時兩端無法同時參與構成回文子串行,則[i:j]的所有可能數

f[i][j] = f[i+1][j] + f[i][j-1] - f[i+1][j-1]
class

solution

f[i]

[j]=

(f[i]

[j]>=0)

?f[i]

[j]%mod:f[i]

[j]+mod;}}

return f[0]

[n-1];}};

字串 最長回文子串

最長回文子串 回文子串 即正著看和倒著看相同的子串,如 abcba yyxyy。由於此類題目為面試筆試常考題目,所以現在就來整理一下啦。1 暴力求解法 最直接的想法就是暴力求解,但是我們可以看到下面的 時間複雜度是o n 3 string findlongeststring string str 暴...

字串 最長回文子串

介紹一下幾個概念 就是從左往右和從右往左讀是一樣的。就如標語 我為人人,人人為我 子串,顧名思義,就是在原字串中的子集,就叫子串。串就是不能分割的,就是連在一起,這個要區別與子串行,子串行就是一段 一段的。列舉各個起點和終點,然後進行判斷該子串是否為回文,最後就是更新最長的回文串。列舉起點和終點 o...

字串 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路 用manacher class solution int max 1 int res 0 儲存最...