hiho刷題日記——第一天最長迴文子串

思路:

將字符串位置0存入一個-1空出來。

//這裏是因爲我準備列舉迴文子串的中心點。並判斷其兩端的點是否相等。而-1(或這說255)是一個很難出現的字符。

讓字符串從1開始存入。

然後依次列舉中心點。

//這裏需要注意一個問題就是迴文子串的長度。考慮到迴文子串可能是偶數長度,而偶數長度的迴文子串的最中心的有又相同的。所以加入了while (p[e + 1] == p[i]) ++e; 來兼顧偶數長度的迴文子串。

根據中心點向兩邊延生。找到以其中心的迴文子串的長度。與當前求得的最長長度比較,取捨。


#include <cstdio>

#include <cstring>
using namespace std; 
char str[1000002 + 1200];


int fast(char *p)
{
    int ans = 1;
    for (int i = 1; p[i]; ++i)
    {
        int s = i, e = i, t;
        while (p[e + 1] == p[i]) ++e;  //同時兼顧了偶數長度的迴文子串
        i = e;
        while (p[s - 1] == p[e + 1]) --s, ++e;
        if ((t = e - s + 1) > ans) ans = t;
    }
    return ans;
}


int main()
{
    str[0]=-1;
    int n;
    scanf("%d", &n);
    while (n --) {
        scanf("%s", str + 1);
        printf("%d\n", fast(str));
    }
    return 0;
}
發佈了34 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章