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
第一种解法:
将字符压入前面与之相同的所有字符的vector数组中,数组的下标就是字符在输入的字符串的下标,然后检测以其中两个为首尾的字符串是否是回文字符即可,但是在提交上去显示出现了有些样例段错误,找不到原因,如果有类似想法的小伙伴,欢迎一起来交流
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
vector<int>ve[N];
map<char,int>mp;
bool check(string s){
//判断是否是回文串的方法
if(s.size()==1) return true;
/*string t=s;
reverse(t.begin(),t.end());
if(s==t) return true;
return false; */
for(int i=0,j=s.size()-1;i<=j;i++,j--){
if(s[i]!=s[j])
return false;
}
return true;
}
int main(){
string s;
getline(cin,s);
for(int i=0;i<s.size();i++){
if(mp[s[i]]==0){
mp[s[i]]=i+1;
ve[i].push_back(i);
}else{
for(auto j:ve[mp[s[i]]-1]){
ve[j].push_back(i);
}
ve[i].push_back(i);
}
}
int max_num=0;
for(int i=0;i<s.size();i++){
int tt=s.size()-i;
if(tt<max_num) break;
while(!ve[i].empty()){
int j=ve[i].back();
ve[i].pop_back();
if((j-i+1)<max_num){
break;
}
string ss=s.substr(i,j-i+1);
//int jj=ss.size();
if(check(ss)){
max_num=j-i+1;
break;
}
}
}
printf("%d\n",max_num);
return 0;
}
第二种解法:遍历当前字符串中的每个字符,然后以该字符向左向右进行拓展,查找最长的回文串,分为两种类型,(1)是ABCBA的类型,以当前的字符为中心,向左右拓展同样的字符,观察是否相等;(2)ABBA的类型,以当前字符为左侧的一个字符,来向右进行进行拓展,看是否相等
满分代码如下:
#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;//j表示当前字符左侧的字符的个数
//ABCBA的形式
for(j=1;i-j>=0&&i+j<s.size()&&s[i-j]==s[i+j];j++){
maxlen=max(maxlen,2*j+1);
//更新回文串的最大长度
}
//ABBA的形式
for(j=0;i-j>=0&&i+j+1<s.size()&&s[i-j]==s[i+j+1];j++){
maxlen=max(maxlen,2*(j+1));
}
}
if(maxlen==0) maxlen=1;
printf("%d",maxlen);
return 0;
}