最長回文串 manacher演算法java實現

2021-08-05 22:07:56 字數 1068 閱讀 3821

最長回文串是乙個很好玩的話題,給出乙個無序的不定長的字串行,如何知道裡面的最長回文串呢?

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 ...