7-6 最长对称子串 (25分)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
选拔时候得错误代码
#include <bits/stdc++.h>
using namespace std;
//想法就是两个指针从头尾开始遍历,尾指针一直到和头指针不相等或相同位置为止
//每次记录最大长度
int length(string s,int i,int j){
int clen=0;
for(;j==i;j--){
if(s[j]!=s[i]){
clen=0;
break;
}else{
i++;
clen++;
}
}
return clen;
}
int main()
{
string s;
cin>>s;
int mlen=0,clen=0;
for(int i=0;s[i]!='\0';i++){
clen=0;
for(int j=s.length()-1;j>=i;j--){
if(s[j]==s[i]){
clen=length(s,i,j);
}
}
if(mlen<clen){
mlen=clen;
}
}
cout<<mlen*2+1;
return 0;
}
正确得
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin,s);
int mlen=0,clen=0;
for(int i=0; s[i]!='\0'; i++)
{
for(int j=s.length()-1; j>=i; j--)
{
int flag=1;
if(s[i]==s[j])//遇到相同得,截取字串,做对称比较
{
string s2=s.substr(i,j+1-i);
for(int x=0; x<s2.length(); x++)//对称比较
if(s2[x]!=s2[s2.length()-1-x])
flag=0;
if(flag)
clen=s2.length();
if(mlen<clen)
mlen=clen;
}
}
}
cout<<mlen;
return 0;
}