巧妙的解法
需要考虑回文字符串是奇数还是偶数
参考其他人的代码,
i从0开始计数,j从1开始计数
如果回文字符串为奇数
判断i-j和i+j所在位置的字符是否相等,
同时注意循环的必要条件
i>=j;
i+j<length;
for(int i=0;i<len;i++){
temp=1;
for(int j=1;j<len;j++){
if(i-j<0||i+j>=len||s[i-j]!=s[i+j]){
break;
}temp += 2;
}
max = temp > max? temp : max;
}
如果回文字符串为偶数
判断i-j+1和i+j所在位置的字符是否相等
同时循环的必要条件
i+1>=j;
i+j<length;
for(int i=0;i<len;i++){
temp=0;
for(int j=1;j<len;j++){
if(i-j+1<0||i+j>=len||s[i-j+1]!=s[i+j]){
break;
}temp += 2;
}
max = temp > max? temp : max;
}
总代码如下
#include<iostream>
using namespace std;
int main(){
string s;
getline(cin , s);
int max=0,temp;
int len=s.length();
for(int i=0;i<len;i++){
temp=1;
for(int j=1;j<len;j++){
if(i-j<0||i+j>=len||s[i-j]!=s[i+j]){
break;
}temp += 2;
}
max = temp > max? temp : max;
}
for(int i=0;i<len;i++){
temp=0;
for(int j=1;j<len;j++){
if(i-j+1<0||i+j>=len||s[i-j+1]!=s[i+j]){
break;
}temp += 2;
}
max = temp > max? temp : max;
}
cout<<max;
return 0;
}
参考文章:
L2-008. 最长对称子串-PAT团体程序设计天梯赛GPLT – 柳婼 の blog
7-9 最长对称子串_韩旭051的博客-CSDN博客_最长对称子串
暴力求解
#include <iostream>
using namespace std;
#include<string>
#include<cstring>
int main()
{
string s;
getline(cin,s);
int length=0;
// if(s.size()%2==0)
// length=0;
// else
// length=1;
for(int i=0;i<s.size();i++)
{
//int temp=0;
for(int j=s.size()-1;j>=i;j--)
{
int l=i,r=j;
while(l<=r&&s[l++]==s[r--])
if(l>r)
length=max(length,j-i+1);
}
// if(temp>length)
// length=temp;
}
cout<<length<<endl;
return 0;
}
用#方法
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin,s);
string cnt="#";
int len=s.size();
for(int i=0;i<len;i++) cnt+=s[i],cnt+='#';
len=cnt.size();
int ans=1;
for(int i=0;i<len;i++)
{
int tmp=0;
if(cnt[i]!='#') tmp++;
for(int j=i-1,l=i+1;j>=0&&l<len;j--,l++)
if(cnt[j]==cnt[l])
{ if(cnt[j]!='#') tmp+=2;}
else break;
ans=max(ans,tmp);
}
cout<<ans;
}
不太懂的一种
三层循环,
i从尾部开始
j从头部开始
前两个循环的判断条件为i+j<len
t=j,k=i
#include<stdio.h>
#include<string.h>
char str[1010];
int main(){
int i,j,t,k;
int flag = 0;
gets(str);
int l = strlen(str);
for(i=l-1;i>=2;i--){
for(j=0;i+j<l;j++){ //第一趟,最大的范围,一次,第二趟 (0到l-2, 1到l-1,两次),第三趟 (0到l-3,1到l-2,2到l-1,一共三趟).......
for(t=j,k=i+j;k>=t;t++,k--){
if(str[t]!=str[k])
break;
}
if(t>k){ //只要满足这个条件代表已经找到最大的回文串了
flag = 1;
break;
}
}
if(flag == 1){//说明前面break,已经找到最大对称的了,此时i即为长度-1,因为是从0到i的所以长度应该是i+1;
break;
}
}
if(i>=2){
printf("%d",i+1);
}else{
printf("1");
}
}