给定一个字符串 s ,找到 s 中最长的回文字串。假设 s 最长为1000

#include<stdio.h>
#include<string.h>
int find_longest(char *s, int length);
int find_odd(char *s, int i, int length);
int find_even(char *s, int i, int length);

int main(void)
{
  char s[1001];
  scanf("%1000s", s);
  int max = find_longest(s, strlen(s));  // 传入字符串的长度
  printf("%d", max);
}

int find_longest(char *s, int length)
{
  int max_length = 0;  // 记录最长的回文字串长度
  int temp = 0;
  for (int i = 2; i < length; i++)
  {
    if (s[i] == s[i - 2])  // 如果i处的数和i-2处的数相同,那么该回文字串长度为奇数,i-1就是回文字串的中点
    {
      temp = find_odd(s, i, length);
      if (max_length < temp)
        max_length = temp;
    }
    if (s[i] == s[i - 1])  // 如果i处的数和前一个数相同,那么该回文字串长度为偶数,i和i-1为最中间的两项
    {
      temp = find_even(s, i, length);
      if (max_length < temp)
        max_length = temp;
    }
  }

  return max_length;
}

int find_odd(char *s, int i, int length)  // 当回文字串长为奇数时
{
  int string = 1;
  int j = 2;
  while (s[i] == s[i - j] && i < length)  // 逐一与之前的字符串比较,找到回文字符串的开始和结束
  {
    string += 2;
    i++;
    j += 2;
  }
  return string;
}

int find_even(char *s, int i, int length)  // 当回文字串长度为偶数时
{
  int string = 0;
  int j = 1;
  while (s[i] == s[i - j] && i < length)
  {
    string += 2;
    i++;
    j += 2;
  }
  return string;
}

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒