小明的字符串问题

 

描述

小明刚刚做完了回文电话号码的问题,觉得意犹未尽,开始思考一个升级版的问题:随便给一个长度不超过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;
}