数据结构与算法之Manacher算法
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法之Manacher算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)結(jié)構(gòu)與算法之Manacher算法
目錄
1. Manacher算法概述
2. Manacher算法代碼實(shí)現(xiàn)
public class Code_Manacher {public static char[] manacherString(String str) {char[] charArray = str.toCharArray();char[] res = new char[charArray.length * 2 + 1];int index = 0;for (int i = 0; i < res.length; i++) {res[i] = (i & 1) == 0 ? '#' : charArray[index++];}return res;}public static int maxLcpsLength(String str) {if (str == null || str.length() == 0) {return 0;}char[] charArr = manacherString(str);int[] pArr = new int[charArr.length]; //回文半徑int C = -1;int R = -1;int max = Integer.MIN_VALUE;for (int i = 0; i != charArr.length; i++) {//區(qū)分情況一和情況二pArr[i] = R > i ? Math.min(pArr[2 * C - i], R - i) : 1; // 情況1 :i在R外, 暴力擴(kuò) // 情況2 : i在R里, i'的回文在L,R內(nèi) // 情況3 : i在R里,i'的回文在L,R外 // 情況4 :i'回文左邊界和L壓線,從R的右邊擴(kuò)。//如果要驗(yàn)的區(qū)域沒(méi)越界,并且左邊區(qū)域也沒(méi)越界。就再擴(kuò)一下,如果是情況二和情況三,那么會(huì)失敗while (i + pArr[i] < charArr.length && i - pArr[i] > -1) {//情況一,情況四if (charArr[i + pArr[i]] == charArr[i - pArr[i]])pArr[i]++;else {//情況二,情況三break;}}if (i + pArr[i] > R) {R = i + pArr[i];C = i;}max = Math.max(max, pArr[i]);}return max - 1;}public static void main(String[] args) {String str1 = "abc1234321ab";System.out.println(maxLcpsLength(str1));}}編譯結(jié)果:
3. 擴(kuò)展題——如果只能向字符串后面添加字符,怎么讓整體串變成回文串,要求填的字符最少
編譯結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法之Manacher算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据结构与算法之KMP算法
- 下一篇: 数据结构与算法之BFPRT算法