資料結構/PTA-最長對稱子串/串/陣列
阿新 • • 發佈:2020-10-16
對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定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 namespacestd; 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; }