题目
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given "Is PAT&TAP symmetric?", the longest symmetric sub-string is "s PAT&TAP s", hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
即求最长的回文子串长度。
之前用了一种逻辑上是错误的但是也能AC的方法:
将字符串翻转,然后更改原字符串和翻转字符串的错位数,寻找最长的相同子串。
其实这是不对的,比如abc12cba,翻转后为abc21cba,相同子串长度为3,但其实最长的回文子串长度为1。
网上见到不少用这种思想解这类问题的……
几种思路:
1、动态规划,如果s[i~j]是,则s[i]=s[j]且s[i+1~j-1]也是,n^2。
2、以每个数、每两个连续的数为中心向两边展开,n^2。
LeetCode中的Longest Palindromic Substring也是相同的问题,有一种O(n)的大牛的方法
代码:动态规划
using namespace std;
int main()
{
string s;
getline(cin,s); //读取包含空格的一行
int max=1;
int n=s.size(); //字符串长度
bool flag[1005][1005]; //s[i]~s[j]是否是回文,1是,0不是
int i,j;
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
flag[i][j]=true;
for(j=1;j<n;j++)
{
for(i=0;i<j;i++)
{
flag[i][j]=false;
if(s[i]==s[j]&&flag[i+1][j-1]==true)
{
flag[i][j]=true;
if(j-i+1>max)
max=j-i+1;
}
}
}
cout<<max;
return 0;
}