1. 程式人生 > >最長迴文字串(Mancher演算法)

最長迴文字串(Mancher演算法)

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 的最大長度為1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。

示例 2:

輸入: "cbbd"
輸出: "bb"

思路:將字串中每一個元素作為中心算出其最大的迴文字串的長度,最後得出整個字串中最長迴文字串的中心位置和長度。

關鍵:有兩種情況:一、迴文字串長度為奇數。二、迴文字串長度為偶數。當為情況一時為理想情況,只要向左向右比較即可,但是情況二就不好處理,所以可以將所有情況轉化成奇數情況。(Mancher演算法)

假設有str="babad",我們建立一個大小為2*strlen(str)+2,長度的陣列,並將每個元素前面和最後新增一個特殊字元“#”:

s=“#b#a#b#a#d#”;這樣我們就將情況二轉換成情況一。

然後再建立一個數組P來記錄s中每個元素最大回文字串的長度。

以上述為例陣列P為{1,2,1,4,1,4,1,2,1,2,1}

最後找到P中的最大值4(第一個最大值就行)並記錄當前的索引4,因為迴文字串是對稱的且”#“的個數一定比原始元素的個數多1,所以我們的答案的長度為max-1;

程式碼如下:

char* longestPalindrome(char* s) {
    int len=strlen(s);
    char *str=(char*)malloc(sizeof(char)*(2*len+2));
    int p[2*len+1];
    int i,j=1,max=0,max_index;
    str[0]='#';
    for(i=0;i<len;i++)
    {
        str[j++]=s[i];
        str[j++]='#';
    }
    for(i=0;i<2*len+1;i++)
    {
        p[i]=0;
        int j=i,tmp=i;
        while(j<2*len+1&&tmp>=0&&str[tmp]==str[j])
        {
            p[i]++;
            tmp--;
            j++;
        }        
    }
    for(i=0;i<2*len+1;i++)
    {
        if(max<p[i])
        {
            max=p[i];
            max_index=i;
        }
    }
    char *answer=(char *)malloc(sizeof(char)*max);
    i=0,j=0;
    while(i<max-1)
    {
        if(str[max_index-max+1+j]!='#')
        {
            answer[i++]=str[max_index-max+1+j];
        }
        j++;
    }
    return answer;
}

相關推薦

字串Mancher演算法

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

manacher演算法

最長迴文Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25520    Accepted Submission(s

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

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

演算法君帶你學演算法1字串

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

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

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

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

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

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

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

字串--MANACHER演算法

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

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

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

java manacher演算法計算字串

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

JAVA動態規劃--公共子序列問題LCS_subSequence的三種解法與公共子字串LCS_subString的兩種解法與LongestPalindrome

動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。 為了節約重複求相同子問題的時間,引入一個數組,不管它們是否對最終

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

HihoCode1032 子串 manacher演算法

求最長迴文子串的演算法比較經典的是manacher演算法 轉載自這裡 首先,說明一下用到的陣列和其他引數的含義: (1)p[i] : 以字串中下標為的字元為中心的迴文子串半徑長度; 例如:abaa字串,那麼p[1]=2,(以b為中心的迴文子串是aba,半徑長度為2。計算半徑時

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

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

子串——Manacher 演算法​​​​​​​

0. 問題定義 最長迴文子串問題:給定一個字串,求它的最長迴文子串長度。 如果一個字串正著讀和反著讀是一樣的,那它就是迴文串。下面是一些迴文串的例項: 12321 a aba abba aaaa tattarrattat(牛津英語詞典中最長的迴文單詞) 1. Brut

子串-----Manacher演算法

迴文串是指aba、abba、cccbccc、aaaa這種左右對稱的字串。 輸入一個字串Str,輸出Str裡最長迴文子串的長度。 Input 輸入Str(Str的長度 <= 100000) Output 輸出最長迴文子串的長度L。 Input示例 da

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

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

leetcode簡單篇四百零九題

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 “Aa” 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: “abccccdd” 輸出:

LeetCode 409. C、C++、python

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: "abccccdd" 輸出: 7 解釋: