| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 724 人关注过本帖
标题:最长回文子串问题求解
只看楼主 加入收藏
wang155423
Rank: 6Rank: 6
等 级:侠之大者
帖 子:216
专家分:408
注 册:2011-9-4
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:4 
最长回文子串问题求解
今天看到的一个题目,希望大家能提供点思路。。。。。
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000
样例输入
She say:Madam,I'm Adam.

样例输出
Madam,I'm Adam
搜索更多相关主题的帖子: 字符串 
2013-03-16 21:19
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
我觉得每个字母都要检测一次,,,没办法优化吧


[fly]存在即是合理[/fly]
2013-03-17 11:42
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:25 
还是挂着吧,写蛮久的
程序代码:
#include <stdio.h>
#include <string.h>

#define MAX 5000

typedef struct Data
{
    int len;
    char *p;
}Data;
Data result = {1, NULL};

int isletter(char ch)
{
    if ('a' <= ch && 'z' >= ch)
        return 1;
    if ('A' <= ch && 'Z' >= ch)
        return 1;
    return 0;
}

int issame(char a, char b)
{
    if (a == b)    return 1;
    if (a > b)    a -= 'a' - 'A';
    else    a += 'a' - 'A';
    return a == b;
}

void Judge(char *str, int n)
{
    if (!isletter(*str))return;
    int temp = 1, len = n;
    char *p, *q;
    p = str-1, q = str+1;
    while (len > 0 && *q)
    {
        while (!isletter(*p)&& len--)p--;
        if (!len)    break;
        while (!isletter(*q)&& *(q++));
        if (!*q)    break;
        if (!issame(*p, *q))break;
        temp += 2, p--, q++;
    }
    if (result.len < temp)
    {
        while (!isletter(*(++p)));
        result.len = temp, result.p = p;
    }
    
    p = str, q = str+1, temp = 0, len = n;
    while (len > 0 && *q)
    {
        while (!isletter(*p)&& len--)p--;
        if (!len)    break;
        while (!isletter(*q)&& *(q++));
        if (!*q)    break;
        if (!issame(*p, *q))break;
        temp += 2, p--, q++;
    }
    if (result.len < temp)
    {
        while (!isletter(*(++p)));
        result.len = temp, result.p = p;
    }
}

void Output()
{
    while (result.len)
    {
        printf("%c", *(result.p));
        result.len -= isletter(*(result.p++));
    }
    puts("");
}

int main()
{
    char str[MAX];
    gets(str);
    int len = strlen(str);
    for (int i = 1;i < len-result.len;)
        Judge(&str[i], i), i++;
    Output();
    return 0;
}


[ 本帖最后由 azzbcc 于 2013-3-17 17:54 编辑 ]


[fly]存在即是合理[/fly]
2013-03-17 17:51
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:5 
每次选定一个字母作为中间字母(对应于奇数长度的回文串),然后向两边扩展

偶数同理
2013-03-17 19:16
wang155423
Rank: 6Rank: 6
等 级:侠之大者
帖 子:216
专家分:408
注 册:2011-9-4
收藏
得分:0 
回复 3楼 azzbcc
虽然没读懂,还是谢谢了
2013-03-17 20:56
快速回复:最长回文子串问题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.071178 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved