L2-008. 最长对称子串

                    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个,代码明显短多,主要是现在理解比之前更深刻一些了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值