天梯杯 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
這道題目是求最長對稱子串嘛,首先我覺得應該考慮的是它為偶數還是奇數的情況。
首先當子字符串為偶數時,應該指的是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;
}

 


免責聲明!

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



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