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] = '';
    
    return (s+begin);
}
原文地址:https://www.cnblogs.com/sakurapiggy/p/13066809.html