L2-008. 最長對稱子串


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;
}

十分清晰,十分容易,思維巧妙,我怎么想不到?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM