LeetCode-5-最长回文子串
LeetCode-5-最长回文子串
题目
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
题目
这道题也是以前完成的,大概思路是这样的:
假如字符串s中,从i到j的字串是回文串,那么从i+1到j-1肯定也是回文串;
反过来想,如果一个字符肯定是回文串,然后从这个字符出发往两端延伸,两端相同则是回文串;
于是有以下思路:
首先设定一个函数func,给定一个开始i和结束j,然后递归自己,往两端延伸,直到不是回文串为止,返回长度;
遍历数组,将每个字符输入func,获取最大回文串长度,如果当前字符和下一个字符相同,也带入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);
}