給定一個字符串,您應該輸出最長的對稱子字符串的長度。 例如,給定PAT&TAP對稱嗎?,最長的對稱子字符串是s PAT&TAP,因此您必須輸出11。
輸入規格:
每個輸入文件包含一個測試用例,該用例給出的長度不超過1000的非空字符串。
輸出規格:
對於每個測試用例,只需在一行中打印最大長度即可。
輸入樣例:
PAT&TAP是對稱的嗎?
樣本輸出:
11
思路:
dp[ i ] [ j ] = dp[ i+1] [ j-1 ] , s[ i ] == s [ j ];
= 0 , s[ i ] != s [ j ];
邊界:
dp[ i ] [ i ] =1;
if s [ i ] == s [ j ] ,dp[ i ] [ i + 1 ] =1;
代碼:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
string s;
int ans=1;
int dp[1050][1050]; //i->j是否爲迴文,是1,否0
int main()
{
getline(cin,s);
for(int i=0;i<s.length();i++)
{
dp[i][i]=1; //一個點是迴文 長度1
if(i+1<s.length())
{
if(s[i]==s[i+1]) //相鄰兩個點相等是迴文
{
dp[i][i+1]=1; //dp=1 是迴文
ans=2; //長度爲2
}
}
}
for(int l=3;l<=s.length();l++) //字符串長度
{
for(int i=0;i+l-1<s.length();i++)
//當前左端 右端,例如l=3,字符串長度爲3,就是string的0-2三個位置
{
int j=i+l-1; //右端
if(s[i]==s[j] && dp[i+1][j-1]==1)
//左右端相等 並且i+1 -> j-1 是迴文串,那麼i->j也是迴文
{
dp[i][j]=1; //記錄是迴文
ans=l; //更新最長長度
}
}
}
cout<<ans;
return 0;
}