1040 Longest Symmetric String (25 point(s))
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
最长回文子串
方法一:暴力求解
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(void){
string s;getline(cin,s);
int maxLen = 1;
for(int i=0;i<s.length();i++){
for(int j=i+1;j<=s.length();j++){
if(j-i>maxLen){
string sub = s.substr(i,j-i);
string origin = sub;
reverse(sub.begin(),sub.end());
if(origin == sub){
maxLen = j-i;
}
}
}
}
cout<<maxLen<<endl;
return 0;
}
方法2:遍历字符串,向两边扩展(注意分奇数长度、偶数长度两种情况)
参考链接:https://blog.youkuaiyun.com/richenyunqi/article/details/80218079
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
int maxLen=0;
for(int i=0;i<s.size();++i){
int j;
for(j=1;i-j>=0&&i+j<s.size()&&s[i+j]==s[i-j];++j);//以当前字符为回文中心查找最长回文子串
maxLen=max(maxLen,2*j-1);//更新回文子串最大长度
for(j=0;i-j>=0&&i+j+1<s.size()&&s[i-j]==s[i+1+j];++j);//以当前字符为回文中心左侧字符查找最长回文子串
maxLen=max(maxLen,2*j);//更新回文子串最大长度
}
printf("%d",maxLen);
return 0;
}