L2-008. 最長對稱子串

L2-008. 最長對稱子串

時間限制
100 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
做者
陳越

對給定的字符串,本題要求你輸出最長對稱子串的長度。例如,給定"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

相關文章
相關標籤/搜索