1. 程式人生 > >最長迴文字串--MANACHER演算法

最長迴文字串--MANACHER演算法

個人感覺馬拉車演算法的思想和擴充套件KMP的思想是相似的。

首先對於這個問題,我們可以暴力列舉每個子串,然後判斷是否是迴文串,時間複雜度大概是O(n^3),我們運用下尺取法的思想,列舉每一個對稱軸位置(針對長度的奇偶有所區別),那麼時間複雜度會是O(n^2),接著我們如果把字串轉化一下,新增一些未出現過的字元,形成一個長度為奇數的字串。那麼我們只用列舉每一個長度然後判斷就好了。所以如何利用已經得到的資訊判斷最長就是一個優化點。

我們用pos,maxright記錄最大回文半徑,以pos為對稱軸,maxright為最大右邊的位置,len[i]表示以i為對稱軸的迴文半徑長

對於當前的i,可能有兩種情況:(首先一定在pos的右邊)

1 i在maxright左邊

 此時i關於pos的對稱位置為j, 那麼此時關於i為對稱軸,已經形成迴文串的位置有min(len[j],maxright-i)

2 i在maxright的右邊

 此時就需要從頭開始進行匹配。

int init(char *s)//將原字串轉化為帶有特殊標誌的字串t
{
	int len=strlen(s);
	t[0]='@';//防止越界 
	for(int i=1;i<=2*len;i+=2)
	{
		t[i]='#';
		t[i+1]=s[i/2];
	}
	t[len*2+1]='#';
	t[len*2+2]='$';//防止越界 
	return 2*len+1; 
}
int MANACHER(char *s,int lens)//按照馬拉車演算法的思想進行操作
{
	int mx=0,ans=0,pos=0;
	for(int i=1;i<=lens;i++)
	{
		if(mx>i)
		  len[i]=min(len[2*pos-i],mx-i);
		else
		  len[i]=1;
		while(s[i-len[i]]==s[i+len[i]])
		  len[i]++;
		if(len[i]+i>mx)
		{
			mx=len[i]+i;
			pos=i;
		}
		ans=max(ans,len[i]);
	}
	return ans-1;
}


相關推薦

字串--MANACHER演算法

個人感覺馬拉車演算法的思想和擴充套件KMP的思想是相似的。 首先對於這個問題,我們可以暴力列舉每個子串,然後判斷是否是迴文串,時間複雜度大概是O(n^3),我們運用下尺取法的思想,列舉每一個對稱軸位置(針對長度的奇偶有所區別),那麼時間複雜度會是O(n^2),接著我們如果把

【HDU - 3068】Manacher演算法,馬拉車演算法子串)

題幹: 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩

串-manacher演算法模板

給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩組case之間由

poj_1974,字串manacher

時間複雜度為O(n),參考:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474#include<iostream> #inc

hdu 3068 Manacher演算法入門模板題)+解題套路

輸入有a~z組成的字串,輸出最長迴文子串的長度 *Manacher演算法模板  ==> 一個專用於求最長迴文串的演算法 1、轉化字串:abcba  ==>  $#a#b#c#b#a#(

字串演算法-Manacher’s Algorithm-馬拉車演算法

除了翻譯之外,其中還加入了個人的理解的部分,將其中沒有詳細說明的部分進行了解釋。 時間複雜度為O(n)的演算法 首先,我們需要講輸入的字串 S 進行一下轉換得到 T,轉換的方法就是通過在每兩個字元之間插入一個字串“#”,你馬上就能知道為什麼要這麼做。

Manacher演算法:求解字串,時間複雜度為O(N)

迴文串定義:“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。迴文子串,顧名思義,即字串中滿足迴文性質的子串。 經常有一些題目圍繞回文子串進行討論,比如POJ3974最長迴文,求最長迴文子串的長度。樸素演算法是依次以每一個字元為中心

java manacher演算法計算字串

求解最長迴文字串樸素演算法 最樸素的演算法是暴力解法就不談了,時間複雜度是O(n3)。 比最樸素解法稍微好一些的解法是O(n2)的一種解法,思路是從對稱軸開始考慮,根據迴文字串長度的奇偶分為兩種情況,如果最長的迴文字串為偶數位,那麼他的對稱軸是中間部分,

leetcode-中級演算法-陣列和字串-字串

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 思路 這道題很顯然可以用暴力求解,但時

字串不重複子串和子串演算法

一) 這裡用GOLANG實現了一個查詢最長不重複子串的演算法,在暴力查詢的基礎上作了優化,雖然速度還是比較慢,但是有助於理解後邊高階的演算法,值得一記。 暴力查詢的優化思路: 1)如果我們已經查詢到的最大子串長度比剩下沒有for到的子串還長,那最大子串不可能會在發生改變了

字串(Mancher演算法

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。示例 1:輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2:輸入: "cbbd" 輸出: "bb"思路:將字串中每一個元素作為中心算出其最大的迴文字串

O(N)子串演算法——Manacher演算法

題意:在一串連續的字串中尋找它的最長子串(Longest Palindromic Substring) 輸入:先從標準輸入讀取一個整數N(N<=30),代表字串的個數,接下來N行給出N個字串(字串長度<=10^6) 輸出:最長迴文子串長度 題目分析:很自然地

演算法君帶你學演算法(1):字串

演算法君:小白同學,給你出道演算法題,看你小子演算法能力有沒有長進。 演算法小白:最近一直在研究演算法,刷了很多演算法題,正好活動活動大腦,來來來,趕快出題! 演算法君:聽好了,題目是:求一個字串中最長的迴文字串。 演算法小白:這個演算法好像很簡單,就是有一個概念不太明白,啥叫“迴文字串&r

LeetCode 字串檢測

寫了兩個方法,一個7000ms多一個5000ms多,比較菜,看了最厲害的50ms的程式碼,直接寫幾萬個字串做字典查詢,學不來學不來。。。。。。 import numpy as np class Solution: def longestPalindrome2(self, s):

轉載-----Java Longest Palindromic Substring(字串)

轉載地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假設一個字串從左向右寫和從右向左寫是一樣的,這種字串就叫做palindromic string。如aba,或者abba。本題是這種,給定輸入一個字串。要求輸出一個子串,使得子串是最長的padromi

子串--演算法思想探討和實現(python java)

最長迴文子串–演算法思想探討和實現(python java) 迴文串定義: 如果一個字串正著讀和反著讀是一樣的,那它就是迴文串。 下面是一些迴文串的例項: 12321 a aba abba aaaa tattarrattat 問題定義 最長迴

求出 字串 JAVA版本【給出編碼思想-適用於任何語言】

目的:在任意的字串中求出最長的迴文字串   思路:(適用於任何語言)   1、判斷當前給定的字串是否是相同的字串(也就是所有字元都相同),如果是直接返回了。   2、如果第一步沒有返回,就以非第一個字元為軸,分別求出以它為軸的,雙數迴文字串,

PAT (Advanced Level) Practice 1040 Longest Symmetric String (25 分) 字串 dp

#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=

Python求字串(三重迴圈遍歷所有字串 新)

前兩天自己寫了下,雖然對了,但是思路不太好,網上看了遍歷的思路,瞬間感覺之前好蠢,雖然本質上我的程式碼也是遍歷,但是思路不好。 正確思路就是先遍歷出所有長度大於等於2的字串,然後在逐一判斷這些字串是不是迴文字串就行了,思路清晰了,程式碼就簡單多了,10分鐘就寫完了。 d

C語言實現求一個字串字串 動態規劃

求解思路: 迴文字串的子串也是迴文,比如P[i,j](表示以i開始以j結束的子串)是迴文字串, 那麼P[i+1,j-1]也是迴文字串。這樣最長迴文子串就能分解成一系列子問題了。 這樣需要額外的空間O(