L2-008. 最長對稱子串
時間限制
100 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
作者
陳越
對給定的字符串,本題要求你輸出最長對稱子串的長度。例如,給定"Is PAT&TAP symmetric?",最長對稱子串為"s PAT&TAP s",於是你應該輸出11。
輸入格式:
輸入在一行中給出長度不超過1000的非空字符串。
輸出格式:
在一行中輸出最長對稱子串的長度。
輸入樣例:Is PAT&TAP symmetric?輸出樣例:
11
一看最長二字,心頭油然升起一種恐慌,心中已經定義為最優化問題
因為DP問題這塊硬骨頭,自己啃起來實在難受,氣焰頓時消了一半。
http://blog.csdn.net/liuchuo/article/details/52138898?locationNum=3&fps=1
可看到上面的分析,
分析:有兩種可能,一種是回文字符串的長度為奇數,一種是偶數的情況。i為字符串當前字符的下標。
當回文字串為奇數的時候,j表示i-j與i+j構成的回文字串長度;當回文字串長度為偶數的時候,j表示i+1左邊j個字符一直到i右邊j個字符的回文字串長度~~~
用maxvalue保存遍歷結果得到的最大值並且輸出~~
#include <iostream> using namespace std; int main() { string s; getline(cin, s); int maxvalue = 0, temp; int len = s.length(); for(int i = 0; i < len; i++) { temp = 1; ///回文串為奇數 for(int j = 1; j < len; j++) { if(i - j < 0 || i + j >= len || s[i - j] != s[i + j]) break; temp += 2; } ///回文串為偶數 maxvalue = temp > maxvalue ? temp : maxvalue; temp = 0; for(int j = 1; j < len; j++) { if(i - j + 1 < 0 || i + j >= len || s[i - j + 1] != s[i + j]) break; temp += 2; } maxvalue = temp > maxvalue ? temp : maxvalue; } cout << maxvalue; return 0; }
十分清晰,十分容易,思維巧妙,我怎么想不到?