厦大C语言上机 1511 小明的字符串问题

小明的字符串问题

 

描述

小明刚刚做完了回文电话号码的问题,觉得意犹未尽,开始思考一个升级版的问题:随便给一个长度不超过1000的字符串s,一定可以找到很多回文子串,例如s="babad",可以找到"bab"和"aba",那么在这些回文子串中,最长的那个子串是什么呢?请你写一个程序帮小明回答这个问题。

如果有多个相同长度的回文子串,请输出最先出现的那个。

注意:

  1. 你提交的代码将被插入到以下程序框架中一起编译,所以请不要提交全部代码;
  2. 可以增加自定义函数。
//固定头部开始
#include <stdio.h>
#include <string.h>
//固定头部结束

//你的代码开始
void find_palindrome(char *s, char *r)
{

}
//你的代码结束

//固定尾部开始
int main()
{
    char s[1001]= {0}, r[1001] = {0};
    scanf("%s", s);
    find_palindrome(s, r);
    printf("%s", r);
    return 0;
}
//固定尾部结束

 

输入

一个长度不超过1000的字符串,字符串保证不含空格。

 

输出

最早出现的、最长的那个回文子串

 

输入样例 1 

cbbd

输出样例 1

bb

 

来源

xmu

 

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

void find_palindrome(char *s, char *r)
{
    int max_len = 1, start = 0;
    int low, high;

    for (int ptr_s = 1; ptr_s < (int)strlen(s); ++ptr_s)
    {
        low = high = ptr_s;
        while (low >= 0 && high < (int)strlen(s))
        {
            if (s[low] != s[high])
                break;
            if (high - low + 1 > max_len)
            {
                max_len = high - low + 1;
                start = low;
            }
            low--;
            high++;
        }

        low = ptr_s - 1;
        high = ptr_s;
        while (low >= 0 && high < (int)strlen(s))
        {
            if (s[low] != s[high])
                break;
            if (high - low + 1 > max_len)
            {
                max_len = high - low + 1;
                start = low;
            }
            low--;
            high++;
        }
    }

    for (int ptr_r = 0; ptr_r < max_len; ++ptr_r)
        r[ptr_r] = s[start + ptr_r];
    r[max_len] = '\0';
}

int main()
{
    char s[1001]= {0}, r[1001] = {0};
    scanf("%s", s);
    find_palindrome(s, r);
    printf("%s", r);
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值