問題描述:編寫乙個函式,引數為乙個字串,返回這個字串的最長回文子串長度。
解決方法:
方法一:因為如果乙個字串是回文的,那麼以某個字元為基點的字首和字尾都是相同的。所以可通過遍歷某個字元作為基點,然後再基點處前後進行掃瞄,記錄並更新得到最長的回文子串。
實現**如下:
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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...