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