最長回文子串

2021-07-09 09:31:30 字數 1313 閱讀 4536

問題描述:編寫乙個函式,引數為乙個字串,返回這個字串的最長回文子串長度。

解決方法:

方法一:因為如果乙個字串是回文的,那麼以某個字元為基點的字首和字尾都是相同的。所以可通過遍歷某個字元作為基點,然後再基點處前後進行掃瞄,記錄並更新得到最長的回文子串。

實現**如下:

public static int getlongestpalindrome(string str) 

if (c > max)

max = c;

//回文子串長度為偶數的情況

for (j = 0; i - j >= 0 && i + j + 1 < len; j++)

if (c > max)

max = c;

}return max;

}

方法二:基於manacher演算法。manacher演算法描述如下:

首先,在每個字元的兩邊都插入乙個特殊的符號,將所有可能的基數或偶數長度的回文子串都轉換成了奇數長度。比如"abba"轉換成"#a#b#b#a#","aba"轉換成"#a#b#a#"。

此外為了進一步減少編碼的複雜度,可以在字串的起始處新增另乙個特殊字元,這樣就不需要處理越界問題。比如"$#a#b#a#"。

以字串s = "abbabcba"為例,插入'$'和'#'這兩個特殊符號,轉換成"$#a#b#b#a#b#c#b#a#",然後用乙個陣列p[i]來記錄以字元s[i]為基點的最長回文子串字首或字尾的長度(包括s[i])。

此時字串s與陣列p的對於關係如下:

//mx > i,那麼p[i] >= min(p[2 * id - i], mx - i)

//故誰小取誰

if (mx - i > p[2*id - i])

p[i] = p[2*id - i];

else //mx-i <= p[2*id - i]

p[i] = mx - i;

//輸入,並處理得到字串s

int p[1000], mx = 0, id = 0;

memset(p, 0, sizeof(p));

for (i = 1; s[i] != '\0'; i++)

}//找出p[i]中最大的

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

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

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...