L2-008. 最长对称子串
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:Is PAT&TAP symmetric?输出样例:
11
#include<iostream>
#include<string.h>
using namespace std;
char a[2000];
int sum1;
int sum2;
int dfs(int l,int t,int r)//奇数
{
if(l<0||r>=strlen(a))
return 0;
if(a[r]==a[l])
{
sum1++;
dfs(l-1,t,r+1);
}
else
return 0;
}
int dfs(int l,int r)//偶数
{
if(l<0||r>=strlen(a))
return 0;
if(a[r]==a[l])
{
sum2++;
dfs(l-1,r+1);
}
else
return 0;
}
int main()
{
int i,j,max1=-1,max2=-1;
int temp1=0,temp2=0;
sum1=0;//假如输入aaaa会不仅执行奇数还执行偶数,所以要取两种情况中结果的最大值
sum2=0;
gets(a);
for(i=0;i<strlen(a);i++)
{
sum1=0;
sum2=0;
if(a[i-1]==a[i+1])//偶数
{
dfs(i-1,i,i+1);
if(max1<(sum1*2+1))
{
max1=sum1*2+1;
}
}
if(a[i]==a[i-1])//奇数
{
dfs(i-1,i);
if(max2<sum2*2) max2=sum2*2;
}
}
if(max1==max2&&max2==-1)//假如输入as两个dfs不执行,此时标记都为-1 一开始没考虑到
cout<<1<<endl;
else if(max1>=max2)
cout<<max1<<endl;
else
cout<<max2<<endl;
}
另一种算法
#include <cstdio>
#include <cmath>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
getline(cin,s);
int i,j,a,max=0,t,min=0,k;
a=s.length();
for(i=0;i<a;i++)
{
t=0;
for(j=1;;j++)
{
if(s[i-j]==s[i+j]&&i-j>=0&&i+j<a)
{
t++;
}
else
{
if(t>max)
max=t;
break;
}
}
}
for(i=0;i<a;i++)
{
t=0;
k=0;
for(j=1;;j++)
{
if(s[i-k]==s[i+j]&&i-k>=0&&i+j<a)
{
t++;
k++;
}
else
{
if(t>min)
min=t;
break;
}
}
}
max=max*2+1;
min=min*2;
if(max>min)
printf("%d\n",max);
else
printf("%d\n",min);
return 0;
}
最近在做leetcode上的题,遇到一个同样的题目,贴一下现在的题解:
class Solution {
public:
string ss;
int dfs(int left, int right)
{
if(left<0 || right >=ss.size() ||ss[left] !=ss[right])
return left+1;
else
return dfs(left-1,right+1);
}
string longestPalindrome(string s)
{
ss = s;
string res="";
int i,j,k,ms = 0,now_left,len,sx=0;
if(s.size() ==1)
return s;
for(i = 0; i + 1 <s.size(); i ++ )
{
if(s[i]==s[i+1]) //偶数
{
now_left = dfs(i,i+1);
len = (i-now_left+1)*2;
if(ms<len)
{
ms = len;
sx = now_left;
}
}
if(i-1>=0&&s[i-1]==s[i+1])//奇数
{
now_left = dfs(i-1,i+1);
len = (i-now_left)*2+1;
if(ms<len)
{
ms = len;
sx = now_left;
}
}
}
//找不到回文字符串
if(ms==0)
res+=s[0];
for(i=sx; i<sx+ms;i++)
res+=s[i];
return res;
}
};
将以前的两个dfs缩短为1个,代码明显短多,主要是现在理解比之前更深刻一些了。