LeetCode-5-最长回文子串

题目

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd" 输出: "bb"

思路

这道题我自己没有什么很好的思路,于是腆着脸取看了官方的解题思路,链接如下:

https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode/

代码

这里我采用了方法三,使用func函数实现给定对给定的i,j找到最长回文串P(i,j)的长度。

然后在longestPalindrome函数中遍历该字符串,以每个字符为中心或二元中心调用func获取最长回文串的长度。

最后选取最长的回文串,并将之后字符串的截断并返回。

代码如下:

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

int func(int i, int j, char *s)
{
int len = strlen(s);

// 超出边界判断
if (i-1 < 0 || j+1 == len)
{
return (j-i+1);
}

// 不相等判断
if (s[i-1] != s[j+1])
{
return (j-i+1);
}
else
{
return func(i-1, j+1, s);
}
}


char * longestPalindrome(char * s){
int begin = -1, max = -1;
   int len = strlen(s);
   int half = 0, tmp = 0;
   int i = 0;
   
   
   if (len == 0 || len == 1)
  {
  return s;
  }
   
   // 遍历该字符串
   for (i=0; i<len-1; i++)
  {
tmp = func(i, i, s);
if(tmp > max)
{
half = tmp / 2;
max = tmp;
begin = i - half;
}
if (s[i] == s[i+1])
{
tmp = func(i, i+1, s);
if (tmp > max)
{
half = tmp / 2;
max = tmp;
begin = i - half + 1;
}
}
  }
   // 截断字符串
   s[begin+max] = '\0';
   
   return (s+begin);
}



posted @ 2020-03-24 23:09  樱花小猪  阅读(417)  评论(0编辑  收藏  举报