求最長回文字串的長度

2021-08-26 01:39:12 字數 1257 閱讀 6985

題目描述:

輸入乙個字串,求出其中最長的回文字串的長度。子串的含義為:在原串中連續出現的字串片段。回文的含義是:正著看和倒著看相同,如abba和yyxyy。在判斷時,應該忽略所有標點符號和空格,且忽略大小寫,但輸出應保持原樣(在回文串的首部和尾部不要輸出多餘字元)。輸入字串長度不超過5000,且佔據單獨的一行。應該輸出最長的回文串,如果有多個,輸出起始位置最靠左的。

樣例輸入:confuciuss say:madam,i『m adam.

樣例輸出:madam,i'm adam.

思路分析:

1.首先將字母全部轉換為大寫字母(isalpha函式和toupper函式),存入另乙個陣列。

2.列舉回文串的起點和終點。

3.判斷是不是回文串。

第一次**可以先求出最長回文字串的長度:

#include#include#include#includeusing namespace std; #define maxn 5010 char buf[maxn], s[maxn]; int main() if(ok && j - i + 1 > max) max = j - i + 1; } } printf("%d\n", max); }

這個程式還有一些功能沒有完成,但離成功已經不遠了-在實際程式設計中,我們經常先編寫乙個具備主要功能的程式,再加以完善。我們甚至可以先寫乙個只有輸入輸出功能的骨架,但是要確保它正確。這樣,每次只新增一點點小功能,而且寫一點就測試一下,保證它的正確性。這種方法稱為迭代式開發。

現在的任務是輸出這個回文串:要求原樣輸出,並且盡量靠左。輸出靠左的條件已經滿足了。我們是從左到右列舉的,且只在j - i + 1嚴格大於max時才更新。這樣,就只剩下唯一的問題了:原樣輸出。

我們可以新開乙個陣列,用以記錄s陣列中字母在原陣列中的起點和終點,之後輸出即可。但是,題目中要求的字元可能多達5000個。則發現,效率太低。tle。

另一種思路:

列舉回文串的中間位置i,然後不斷向外擴充套件,直到有字元不同。(長度為奇數和偶數處理方式不同)

最終**如下:

#include#include#include#include#include#includeusing namespace std; char buf[5005], res[5005], pri[5005]; int main() } for(i = 0; i < m; ++i) } for(j = 0; i - j >= 0 && i + j < m; ++j) } } for(i = x; i <= y; ++i) printf("\n"); } return 0; }

manacher演算法求最長回文串長度

manacher演算法 定義陣列p i 表示以i為中心的 包含i這個字元 回文串半徑長 將字串s從前掃到後for int i 0 i由於s是從前掃到後的,所以需要計算p i 時一定已經計算好了p 1 p i 1 假設現在掃瞄到了i k這個位置,現在需要計算p i k 定義maxlen是i k位置前所...

最長回文自負串1 求長度

最長回文字串1 求長度 回文字元 在判斷時,忽略所有的標點和空格,且忽略大小寫,輸出保持原樣 本程式為最長字串1,只計算 長度 核心 開始操作前會有乙個預處理,就是把所有的字元經行篩選和轉換,並構造乙個新字元組,把所有的字母轉換成大寫的字母存入到新字母組中 然後,再乙個乙個的判斷,這樣會簡單很多 i...

馬拉車(求最長回文字串)

參考 時間複雜度 o 要分奇數子字串與偶數子字串 時間複雜度 o string findlongest string s return s.substr start,end start 1 int expand string s,int left,int right return r l 1 不用分...