1. 程式人生 > >hiho一下第一週#1032 : 最長迴文子串

hiho一下第一週#1032 : 最長迴文子串

一個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長迴文子串的意思就是這個字串中最長的身為迴文串的子串

思路1

以字串中的每個字元為中心,向左右兩邊尋找,直到找到最長的迴文子串

int longestHuiWen(string &p) {
    p = '$' + p;
    int ans = 0;
    for (int i = 1; p[i]; ++i) {
        int start = i, end = i;
        while (p[end + 1] == p[i])  ++end
;
//跳過相同字元 i = end; while (p[end + 1] == p[start - 1]) ++end, --start; ans = max(ans, end-start+1); } return ans; }

思路2

考慮大回文中包含著小回文,下圖id為迴文中心,mx為迴文邊界。f[id]為迴文串向左右擴張的長度,則有mx = id+f[id]

  • i < mx時
    • 情況1,小回文大回文內,mx-i > f[j],則f[i]=f[j]。
      這裡寫圖片描述
    • 情況2,小回文超出大回文
      範圍,mx-i <= f[j],則至少綠色框內是匹配的,超出邊界的需要去嘗試
      這裡寫圖片描述
    • 綜上可以得出結論f[i] >= min(f[2*id-i], mx-i)
  • i >= mx時,無法做出更多假設,f[i] = 1。

為保證字串在奇數偶數下都能正常工作,我們在字串中插入’#’,如$#a#b#a#b#a#b#a#,對此字串我們得出一個有趣的結論,f[id]-1即為以id為軸的最大回文串長度。

int Manacher(string &p) {
    string s;
    s += "$#";
    int n = 2;
    for
(int i = 0; p[i]; ++i, n += 2) s += p[i], s += '#'; int maxRight = 1, j = 0; for (int i = 1; i < n; ++i) { if (maxRight > i) { f[i] = min(maxRight - i, f[2 * j - i]); }else { f[i] = 1; } while (s[i + f[i]] == s[i - f[i]]) f[i]++; if (f[i] + i > maxRight) { maxRight = f[i] + i; j = i; } } int ans = 0; for (int i = 0; i < n; ++i) ans = max(ans, f[i] - 1); return ans; }

相關推薦

hiho一下第一#1032 :

一個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長迴文子串的意思就是這個字串中最長的身為迴文串的子串 思路1 以字串中的每個字元為中心,向左右兩邊尋找,直到找到最長的迴文子串

HiHo #1032 : 【Manacher演算法】

#1032 : 最長迴文子串 時間限制:1000ms 單點時限:1000ms 記憶體限制:64MB 描述    小Hi和小Ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫

HiHo 1032 (Manacher演算法求解)

Manacher演算法o(n)求解最長迴文子串問題 非常巧妙 #include<bits/stdc++.h> using namespace std; char str[2000020],s[2000020]; int p[2000020]; int len,

hihocoder #1032 :

時間限制:1000ms 單點時限:1000ms 記憶體限制:64MB 描述    小Hi和小Ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的

51nod-【hihocoder #1032 :

<span style="font-size:18px;"> </span><span style="font-size:18px;">include<cst

hihocoder 1032 (Manacher演算法 詳解+模板)

時間限制:1000ms 單點時限:1000ms 記憶體限制:64MB 描述    小Hi和小Ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的

hdu3068 hihocoder 1032 馬拉車演算法

#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; char s1[maxn],s2[2*maxn];int p[2*maxn]; void gets2() { int len=

hiho 第一

小Ho這一想就是三天,小Hi也是看不下去了,決定來開導開導小Ho:“小Ho,你有沒有想過,在之前的計算中,計算出以每一個位置為中心的最長迴文子串的長度有沒有什麼用呢?” 小Ho答道:“我想想,如果以第5個字元為中心的最長迴文子串的長度是5的話,這就告訴了我[3, 7]這一段是一個迴文子串,所以呢?” 小Hi

leetcode5:Longest Palindromic Substring

python版: class Solution: def longestPalindrome(self, s): """ :type s: str :rtype: str """ start = en

【HDU - 3068】(Manacher演算法,馬拉車演算法求

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

DP

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb" 分析:dp    dp[ j ][ i

【探索-中級演算法】

這一題可以參考:647. 迴文子串 本質上是一樣的,要判斷出所有的迴文字串,然後找到其中最長的那一個。 中心擴充套件法 中心擴充套件就是把給定的字串的每一個字母當做中心,向兩邊擴充套件,這樣來找最長的子迴文串。演算法複雜度為O(N^2) public Stri

LeetCode5

這兩天被這個題弄得是有些崩潰了,因為之前試的兩種方法都是超時了,所以弄得後面都有些不想弄了。還好有度娘,最後用的是從中間往兩邊擴充套件的方法得此解決,真的是如釋重負啊!廢話不說,講正文貼程式碼。 題目如下: 給定一個字串 s,找到 s 中最長的迴文子串。你可以假

(Longest Palindromic Substring)

題目描述: 給出一個字串(假設長度最長為1000),求出它的最長迴文子串,你可以假定只有一個滿足條件的最長迴文串。 樣例 給出字串 "abcdzdcab",它的最長迴文子串為 "cdzdc"。 挑戰 O(n2) 時間複雜度的演算法是可以接受的,如果你

演算法學習——尋找字串中的

文章轉載自公眾號《網際網路偵查》 /** * @author xiaoshi on 2018/9/24. * Happy Mid-Autumn Festival */ public class PlalindromeString { // 判斷一個字串是否迴文,演算法中用

LeetCode 5(java程式碼)

方法一:動態規劃       定義P(i,j):如果字串從i位置到j位置是迴文,P(i,j)=true;否則,P(i,j)=false;      那麼P(i,j)= P(i+1,j−1) && Si==Sj &

大連續序列和/不下降序列/公共序列/

//最大連續子序列和 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10010; int A[maxn],dp[maxn]; int main(){ int

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

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

leetcode5:

1 題目 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 題目連結: https

leetcode演算法題—golang—(題5)

題目:最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbb