关闭

最长回文子串

171人阅读 评论(2) 收藏 举报
分类:

最长回文子串

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
输入
输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。
输出
输出所要求的回文子串。
样例输入
1
Confuciuss say:Madam,I'm Adam.
样例输出
Madam,I'm Adam
上传者

苗栋栋



思路:把所有字母丢进一个数组里,并且全部转为大写或者小写,并标记每一个字母在原数组里的位置(方便查找)                     再然后就是从中间向两边遍历,若不相同,break,并比较当前最大值,若大于,就更新坐标,另外,由于是从中间     开始遍历,那么奇偶性显得尤为重要(下面一共有两个代码,第一个是AC的,也就是从中间找,另外一个是超时代码,是从一边开始找的)

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<ctype.h>
#define maxn 5000+10
using namespace std;
char buf[maxn],s[maxn];
int p[maxn];
int main()
{
    int T;
    scanf("%d%*c",&T);
    while(T--)
    {

        int n,m=0,max=0,x,y;
        int i,j;
        gets(buf);
        n=strlen(buf);
        for(int i=0; i<n; i++)
        {
            if(isalpha(buf[i]))
            {
                p[m]=i;
                s[m++]=toupper(buf[i]);
            }
        }
        for(i=0; i<m; i++)
        {
            for(j=0; i-j>=0&&i+j<m; j++)
            {
                if(s[i-j]!=s[i+j]) break;
                if(j*2+1>max)
                {
                    max=j*2+1;
                    x=p[i-j];
                    y=p[i+j];
                }
            }
            for(j=0; i-j>=0&&i+j+1<m; j++)
            {
                if(s[i-j]!=s[i+j+1]) break;
                if(j*2+2>max)
                {
                    max=j*2+2;
                    x=p[i-j];
                    y=p[i+j+1];
                }
            }
        }
        for(i=x; i<=y; i++)
            printf("%c",buf[i]);
        printf("\n");
    }
    return 0;
}

(2)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<ctype.h>
#define maxn 5000+10
using namespace std;
char s[maxn],t[maxn],p[maxn];
int main()
{
    int T;
    scanf("%d%*c",&T);
    while(T--)
    {
        gets(s);
        int n=strlen(s);
        int i,j,m=0,x=0,y=0,maxx=0,k=0;
        for(i=0; i<n; i++)
        {
            if(isalpha(s[i]))
            {
                p[m]=i;
                t[m++]=toupper(s[i]);
            }
        }
        for(i=0; i<m; i++)
        {
            for(j=i; j<m; j++)
            {
                int ok=1;
                for(int k=i; k<=j; k++)
                {
                    if(t[k]!=t[i+j-k])
                        ok=0;
                }
                if(ok&&j-i+1>maxx)
                {
                    maxx=j-i+1;
                    x=p[i];
                    y=p[j];
                }
            }
        }
        for(i=x; i<=y; i++)
        {
            printf("%c",s[i]);
        }
        printf("\n");
    }
    return 0;
}




1
0
查看评论

【最长回文子串】Manache算法,O(N)时间复杂度

找一个字符串里的最长回文子串。 暴力法:定中心,从0长度向两端扩展的方法O(n^2), n >= 10^5还是超时,故只能《O(n^2) Manacher's 算法:定中心,从p[r],(已能确定以该点为中心两端是回文的长度开始),向两端扩展,时间复杂度, O(n) 算法如下:...
  • zhong123123123
  • zhong123123123
  • 2016-05-06 11:15
  • 929

动态规划算法求最长回文子串

给出了动态规划方法求最长回文子串的程序及分析。
  • shineboyxxb
  • shineboyxxb
  • 2016-07-31 16:38
  • 2689

最长回文子串(动态规划和递归)

给一个字符串,找出它的最长的回文子序列的长度。例如,如果给定的序列是“BBABCBCAB”,则输出应该是7,“BABCBAB”是在它的最长回文子序列。 “BBBBB”和“BBCBB”也都是该字符串的回文子序列,但不是最长的。注意和最长回文子串的区别(参考:最长回文串)!这里说的子序列,类似...
  • weijinqian0
  • weijinqian0
  • 2016-04-04 10:24
  • 2854

hihocoder 1032 最长回文子串 (Manacher算法 详解+模板)

hihocoder 1032 最长回文子串 (Manacher算法 详解+模板)
  • Tc_To_Top
  • Tc_To_Top
  • 2016-03-08 21:11
  • 655

51nod oj 1088 1089 最长回文子串 【Manacher算法】

传送门:1088 传送门:1089 1088题的数据是1000可以直接用普通的方法-.- 1089题的数据是10000-.-用Manacher算法 我现在是通过看这位大神的博客学会的-.-最长回文子串(Manacher算法) 发现博客园的画面就是美-.-我已沉迷其中--- ...
  • leibniz_zhang
  • leibniz_zhang
  • 2016-08-10 00:07
  • 422

hihocoder 1032 最长回文子串(Manachar算法)

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述    小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。  &#...
  • disparity_CJK
  • disparity_CJK
  • 2016-09-10 10:56
  • 713

hihoCoder#1032_最长回文子串

求最长回文子串的算法比较经典的是manacher算法,下面写写自己的理解。 (文中用到的图片来自这里,博主写的很好,由于为了图片和代码一致,我稍微p了一下图片。) 首先,说明一下用到的数组和其他参数的含义: (1):       以字符串中下标为...
  • sinat_30071459
  • sinat_30071459
  • 2016-04-02 19:37
  • 1574

最长公共子串、最长公共子序列、最长回文子串、最长回文子序列、回文子串个数

1、最长公共子串 首先看最长公共子串的解答(暴力算法、动态规划、) 从优化到再优化,最长公共子串 2、最长公共子序列(LCS)  解析:动态规划解最长公共子序列问题 3、 leetcode 5 Longest Palindromic Substring 最长回文串 方法1:借助...
  • m0_37693059
  • m0_37693059
  • 2017-08-04 16:39
  • 167

C语言最长回文子串

最长回文子串 Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 3053, Total Submissions: 4193 Description 输入一个字符串,求其中最长回文子串。子串的含义是:在字符串中连续出现的字符串片段。回文的含义是...
  • geshengtong
  • geshengtong
  • 2017-10-28 11:10
  • 238

九度题目1528:最长回文子串

题目1528:最长回文子串 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:781 解决:239 题目描述: 回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。 回文子串,顾名思义,即字符串中满足回文性质的子串。 给出一个只由...
  • u013517797
  • u013517797
  • 2014-04-27 15:54
  • 921
    个人资料
    • 访问:50879次
    • 积分:3308
    • 等级:
    • 排名:第12135名
    • 原创:288篇
    • 转载:18篇
    • 译文:0篇
    • 评论:11条
    博客专栏
    最新评论