1. 程式人生 > 實用技巧 >資料結構/PTA-最長對稱子串/串/陣列

資料結構/PTA-最長對稱子串/串/陣列

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定Is PAT&TAP symmetric?,最長對稱子串為s PAT&TAP s,於是你應該輸出11。

輸入格式:

輸入在一行中給出長度不超過1000的非空字串。

輸出格式:

在一行中輸出最長對稱子串的長度。

輸入樣例:

Is PAT&TAP symmetric?

輸出樣例:

11

思路:

之前做過部分求迴文、對稱式,大都是讓輸出具體的迴文,且迴文唯一,這種情況可以考慮從頭和尾同時遍歷、順序查詢或者是對半查詢

現在這道題需要找到最長對稱子串長度。

情況一:迴文不唯一,而且分佈不均勻。可能前半段的串裡面有4條迴文,後半段只有1條。例如輸出樣例中的 Is PAT&TAP symmetric? ,"PAT&TAP

"、"mm"都是迴文。

情況二:以同字元為中心的迴文。例如輸出樣例中的 Is PAT&TAP symmetric? ,"PAT&TAP"、"AT&TA""T&T"都是迴文。

情況三:老問題,關於迴文的奇偶。、

處理情況二,直接尋找中心字元,以它為中心向它兩側查詢;

處理情況一,在處理二的外面套一層遍歷;

處理情況三:想法是直接暴力地算兩遍,第一遍只算奇數的,第二遍只算偶數的;


程式碼(未ac):

提交了一遍算奇、偶兩遍的反而產生了更多錯誤測試點..........

#include<bits/stdc++.h>
using namespace
std; int main() { string t; int a[1050]= {0}; getline(cin,t); //輸入 int len=t.size(); //串長 int i,j; for(i=0; i<len; i++) { int s=i; int test=1; for(j=0; j<len; j++) { if(t[s-test]==t[s+test]) { a[i+1]+=2
; test++; if((s-test)<0) { break; } } else { break; } } } int max=0; for(i=0; i<len; i++) { if(a[i]>max) { max=a[i]; } } cout<<max+1; return 0; }