解法1:根據是奇數串還是偶數串,遍歷中點,更新最長max值 複雜度o(n^2)
解法2:manacher(馬拉車演算法) o(n)
馬拉車演算法
1.中間插入#符號,統一變為奇數串規避奇偶問題
2.使用乙個輔助p陣列,p[i]表示以 i 為中心的最長回文的半徑,p[i] - 1正好是原字串中最長回文串的長度
3.利用已經求過的p[j]來加快求p[i]的值
mx 和 id 。mx 代表以 id 為中心的最長回文的右邊界,也就是mx = id + p[id]
#include #include #include using namespace std;
const int maxn = 110005;
char s[maxn];
char s_new[maxn * 2];
int p[maxn * 2];
int init()
s_new[j] = '\0'; // 別忘了哦
return j; // 返回 s_new 的長度
}int manacher()
max_len = max(max_len, p[i] - 1);//記錄每個p[i] - 1的最大值
}return max_len;
}int main()
return 0;
}
HDU 3068 最長回文串
用的manacher法,o n 複雜度,證明跟kmp演算法一樣說不清 基本上是參考部落格鏈結 dp法記憶體不夠,中心擴充套件法時間不夠 manacher法 include include include include include include include include include ...
最長回文串 hdu3068
給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 1...
HDU 3068 最長回文
題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...