對給定的字符串,本題要求你輸出最長對稱子串的長度。例如,給定"Is PAT&TAP symmetric?",最長對稱子串爲"s PAT&TAP s",因而你應該輸出11。ios
輸入格式:優化
輸入在一行中給出長度不超過1000的非空字符串。spa
輸出格式:.net
在一行中輸出最長對稱子串的長度。code
輸入樣例: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個字符的迴文字串長度~~~blog
用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; }
十分清晰,十分容易,思惟巧妙,我怎麼想不到?ci