poj_1974,最長迴文字串manacher
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 2001000 using namespace std; char s[maxn],st[maxn]; int p[maxn]; int cases=1; int n; void rebuild() { st[0]='$'; st[1]='#'; int len=strlen(s); for(int i=0;i<len;i++) {st[2*i+2]=s[i];st[2*i+3]='#';} st[2*len+2]=0; } void solve() { int len=2*strlen(s)+2; int id,mx=0,ans=1; for(int i=0;i<len;i++) { if(mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=1; for(;st[p[i]+i]==st[i-p[i]];p[i]++) ; if(p[i]+i>mx) { mx=p[i]+i; id=i; } ans=max(ans,p[i]); } cout<<"Case "<<cases++<<": "<<ans-1<<endl; } int main() { while(gets(s)) { if(s[0]=='E'&&s[1]=='N'&&s[2]=='D') break; rebuild(); solve(); } return 0; }
相關推薦
poj_1974,最長迴文字串manacher
時間複雜度為O(n),參考:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474#include<iostream> #inc
最長迴文字串--MANACHER演算法
個人感覺馬拉車演算法的思想和擴充套件KMP的思想是相似的。 首先對於這個問題,我們可以暴力列舉每個子串,然後判斷是否是迴文串,時間複雜度大概是O(n^3),我們運用下尺取法的思想,列舉每一個對稱軸位置(針對長度的奇偶有所區別),那麼時間複雜度會是O(n^2),接著我們如果把
Manacher演算法:求解最長迴文字串,時間複雜度為O(N)
迴文串定義:“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。迴文子串,顧名思義,即字串中滿足迴文性質的子串。 經常有一些題目圍繞回文子串進行討論,比如POJ3974最長迴文,求最長迴文子串的長度。樸素演算法是依次以每一個字元為中心
【HDU - 3068】最長迴文(Manacher演算法,馬拉車演算法求最長迴文子串)
題幹: 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S 兩
最長迴文字串演算法-Manacher’s Algorithm-馬拉車演算法
除了翻譯之外,其中還加入了個人的理解的部分,將其中沒有詳細說明的部分進行了解釋。 時間複雜度為O(n)的演算法 首先,我們需要講輸入的字串 S 進行一下轉換得到 T,轉換的方法就是通過在每兩個字元之間插入一個字串“#”,你馬上就能知道為什麼要這麼做。
] 找工作知識儲備(2)---陣列字串那些經典演算法:最大子序列和,最長遞增子序列,最長公共子串,最長公共子序列,字串編輯距離,最長不重複子串,最長迴文子串
作者:寒小陽 時間:2013年9月。 0、前言 這一部分的內容原本是打算在之後的字串或者陣列專題裡面寫的,但看著目前火熱進行的各家網際網路公司筆試面試中,出現了其中的一兩個內容,就隨即將這些經典問題整理整理,單寫一
java manacher演算法計算最長迴文字串
求解最長迴文字串樸素演算法 最樸素的演算法是暴力解法就不談了,時間複雜度是O(n3)。 比最樸素解法稍微好一些的解法是O(n2)的一種解法,思路是從對稱軸開始考慮,根據迴文字串長度的奇偶分為兩種情況,如果最長的迴文字串為偶數位,那麼他的對稱軸是中間部分,
Manacher演算法,最長迴文串,時間複雜度O(n)
最長迴文子串 問題 對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。 給定字串A以及它的長度n,請返回最長迴文子串的長度。 測試樣例: “abc1234321ab”,12 返回:7 中心擴充套件到Manache
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
leetcode-中級演算法-陣列和字串-最長迴文字串
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 思路 這道題很顯然可以用暴力求解,但時
求出 最長迴文字串 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(
最長迴文串-manacher演算法模板
給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S 兩組case之間由
LeetCode:Longest Palindromic Substring(最長迴文字串)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "b
409,最長迴文串
給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: "abccccdd" 輸出: 7 解釋: 我們可以
leetcode第五題—最長迴文字串
string longestPalindrome(string &s) { int n=s.size(); if(n==0) return " "; string longest=s.substr(0,1); for(int i=0;i<n-1;i++) { //cente
最長迴文字串-Java實現
一、問題描述 迴文字串定義:如果一個字串正著讀和反著讀是一樣的,那它就是迴文串例如:aba 、 abcba 。 要求: 給出一個字串:asdsaasa 返回一個最長的迴文字串:asdsa 二、解法(迴文字串為奇數) public class Test {