最長回文串是乙個很好玩的話題,給出乙個無序的不定長的字串行,如何知道裡面的最長回文串呢?
manacher演算法的思想是
1 把偶數、奇數長的字串行變成奇數長度
2 建立乙個與字串等長的陣列,用來記錄字串行相應位置上字元的最長回文半徑,半徑為1時預設為字元本身。
3 然後以每個字元為中軸遍歷字串行,之後求陣列的最大值即為最大的半徑,即為最長的回文半徑。
最長回文串便迎刃而解了。
package com.lgy;
public class manacher
public static void domanacher(string s)
s = sb.tostring();
// 以每個字元為軸求最長回文串半徑,其中半徑=1表示字元本身。
int p = new int[s.length()];
int left, right = 0;
for (int i = 0; i < s.length(); i++) else
}p[i] = len;
}//end wai for
//求最大的p[i]值
int pos, maxvaluepos = 0;
for (int i = 0; i < p.length - 1; i++)
if (i == 0)
maxvaluepos = pos;}}
//求得的回文串一定是奇數長度
int reallen = ((p[0] * 2 - 1) - 1) / 2;//最長回文串的長度,去掉其他字元
system.out.println("最長的回文串長度為:" + reallen);
//求最長回文串內容
string huiwen;
stringbuffer realhuiwen = new stringbuffer();
if (reallen == 1) else
system.out.println("最長回文串為:" + realhuiwen.tostring());}}
}
Manacher最長回文串演算法
在介紹演算法之前,首先介紹一下什麼是回文串,所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。一.通常解決的問題 給定乙個字串,求出其最長回文子串。例如 1 s abcd 最長回文長度為 1 2 s a...
manacher演算法(最長回文串)
題目解釋 子串 小於等於原字串長度由原字串中任意個連續字元組成的子串行 回文 關於中間字元對稱的文法,即 aba 單核 cabbac 雙核 等 最長回文子串 1.尋找回文子串 2.該子串是回文子串中長度最長的。首先要知道這個演算法是用來在o n 的時間裡看乙個字串的最長回文子串的長度是什麼。其次,它...
Manacher演算法 最長回文串
若字串長度為n,則演算法的時間複雜度為o n 假設有乙個字串abaaba 先把該字串變成 a b a a b a 第乙個字元設為 防止計算的時候陣列越界 再計算p陣列,先給出p陣列的答案 i為座標,ma陣列放改變後的字串,p陣列代表以該字元為中心,向右和向左延伸p i 個,是回文串 i 0 1 2 ...