列表

详情


OR146. 最长对称子字符串

描述

给定一个字符串(数字或大小写字母), 找出最长的对称的子串(如有多个,输出任意一个)。
例如:
输入:“abbaad”
输出:“abba”

输入描述

字符串

输出描述

字符串

示例1

输入:

a1223a

输出:

22

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 300KB, 提交时间: 2021-09-11

#include <stdio.h>
#include <string.h>

char* solve(char* a ) {
    int len=strlen(a);
	int i,j,k,n=0,max=0;
	for(i=len;i>0;i--)
	{
		for(j=0;j+i<=len;j++)
		{
            for(k=0;k<i/2;k++)
                if(a[j+k]!=a[i+j-k-1])
                    break;
            if(k==i/2)
            {
                int a1;
                char rt[1000],index=0;
                for(a1=j;a1<j+i;a1++)
                    rt[index++]=a[a1];
                strcpy(a,rt);
                return a;
            }
		}
	}
	return "";
}

int main()
{
    char s[1000];
    while(scanf("%s",s)!=EOF)
    {
        if(strlen(s)==1)
        {
            printf("%s\n",s);
            continue;
        }
        printf("%s\n",solve(s));
    }
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-09-26

#include <iostream>
#include <string>

using namespace std;

bool isSymmetric(string str,int start,int end)
{
    int i,len=end-start+1;
    bool res=true;
    for(i=0;i<len/2&&res;i++)
        res=(str[start+i]==str[end-i]);
    return res;
}

int main()
{
    int i,j,len;
    string str,res;
    while(cin>>str)
    {
        len=str.length();
        int start=0,templen=0,maxlen=0;
        for(i=0;i<len;i++)
        {
            for(j=i+maxlen;j<len;j++)
            {
                if(isSymmetric(str,i,j))
                {
                    templen=j-i+1;
                    if(templen>maxlen)
                    {
                        maxlen=templen;
                        start=i;
                    }
                }
            }
        }
        res=str.substr(start,maxlen);
        cout<<res<<endl;
    }
    return 0;
}

上一题