演算法 兩最長回文子串

2021-09-11 17:11:12 字數 1508 閱讀 2897

題目

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。

示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba"也是乙個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

複製**

思路

暴力法。2層迴圈巢狀,遍歷所有子串。在判斷子串是否為回文並對比儲存最大的起止下標。通過前後同時擷取字串對比的方式來判斷子串是否為回文。如果相等,就向兩邊靠攏,直對比的下標相等並且值也相等位置。如果不相等,子串非回文。

中心擴充套件演算法。回文字串有乙個特點,就是左右對稱。如果是奇數長度的回文字串,中間的字元作為對稱點,如aba中的a。如果是偶數長度的回文字串,會以中間兩個字元作為對稱點,如abba中的bb。那麼比較的時候,找到中心點,兩邊擴充套件對比就可以了。直到打破對稱,通過暫存的歷史最長回文子串的起止座標比對當前長度,如果當前子串的長度較大,更新起止座標。由於存在奇偶兩種長度,對應的中心點不一樣,但兩種模式都可能產生回問子串,所有匹配的時候兩種模式都要進行匹配,並取同乙個中心點的兩種模式中長度更長的更新起止座標,這個是編碼時需要處理的細節問題。

編碼細節問題

1.為了獲取最後的子串,需要通過暫存起止座標startindex、endindex。 2.預設奇數匹配方式,通過判斷當前元素與其後面的元素是否相等來決定是否滿足偶數匹配。

char* longestpalindrome(char* s) 

while (frontindex > -1 && nextindex < len && s[frontindex] == s[nextindex])

int current = --nextindex + 1 - ++frontindex ;

if (current > (endindex + 1 - startindex))

if (evenserech)

int current = --nextindex + 1 - ++frontindex ;

if (current > (endindex + 1 - startindex)) }}

char *p = (char*)malloc(sizeof(char*) * (endindex + 1 - startindex));

int j = 0;

for (int i = startindex; i <= endindex; i ++)

return p;

}複製**

小結:需要認真的分析回文的特點,回文串分偶數長度與奇數長度兩種情況(認真審題並分析題目所求,不能忽略了一些必要的點,這一點很重要,卡時間比較多的是想通過修改起止指標的位置來適配偶數的模式,發現怎麼都不能同時適配奇偶兩種情況,如果是兩類情況不能簡單的統一處理的話,要變回單獨處理)。另外這題能反轉字串取相同子串的方法(有坑)、動態規劃和manacher 演算法來處理,後面再學習學習。

待完善l('ω')┘三└('ω')」....

演算法 最長回文子串

題目描述 對於乙個字串,請設計乙個高效演算法,計算其中最長回文子串的長度。給定字串a以及它的長度n,請返回最長回文子串的長度。例如 輸入 abc1234321ab 12 返回值 7 最長回文子串 public static intgetlongestpalindrome string a,int n...

最長回文串 演算法 4 求解最長回文子串

問題描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。注釋 回文通俗的說就是正著念和反著念都一樣,如 上海自來水來自海上。示例 1 輸入 dabccbac 輸出 abccba 示例 2 輸入 cbbd 輸出 bb 解題思路 此處撰寫解題思路 遍歷每乙個索引,...

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...