L2-008. 最長對稱子串
時間限制
100 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
作者
陳越
對給定的字符串,本題要求你輸出最長對稱子串的長度。例如,給定"Is PAT&TAP symmetric?",最長對稱子串為"s PAT&TAP s",於是你應該輸出11。
輸入格式:
輸入在一行中給出長度不超過1000的非空字符串。
輸出格式:
在一行中輸出最長對稱子串的長度。
輸入樣例:Is PAT&TAP symmetric?輸出樣例:
11
這道題目是求最長對稱子串嘛,首先我覺得應該考慮的是它為偶數還是奇數的情況。
首先當子字符串為偶數時,應該指的是i+1右邊j個字符加上i左邊j個字符。
當字符串為奇數時,應該指的是i左邊j個字符加上i右邊j個字符加第i個字符。
所以對稱子字符串必須滿足的是 偶數 i+1-j>0 i+j<len str[i-j+1]==str[i+j]
奇數 i-j>0 i+j<len str[i-j]==str[i+j]
當不滿足時說明此時的i不適合 跳過(前面兩個條件是字符串必須滿足的)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> using namespace std; int main() { char str[1010]; gets(str); int maxn=0,tmp; int len = strlen(str); /* string str; getline(cin,str); int len = str.length(); *///這是我看柳婼 の blog得到的這種輸入,以前沒用過,另外代碼也是參考的她的,開始自己想的很復雜。。。 for(int i=0;i<len;i++) { tmp = 1;//奇數時的情況,tmp不同呀!!! for(int j=1;j<=len;j++) { if(i-j<0 || i+j>=len || str[i-j]!=str[i+j]) break;//不滿足條件了,就跳過,此時的tmp就是i中最長字符串 tmp += 2; } maxn = max(maxn,tmp); tmp = 0;//偶數時的情況 for(int j=1;j<=len;j++) { if(i+1-j<0 || i+j>=len || str[i-j+1]!=str[i+j]) break; tmp += 2; } maxn = max(maxn,tmp); } cout << maxn << endl; return 0; }