题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
白话题目:
给了我们一个字符串,找到里面的子串,对!还是子串,不是子序列。
凹,忘了,啥是回文-----“斗鸡山上山鸡斗;龙隐洞中洞隐龙。”,小时候玩过正话反说没,就是反说和正说一样。
算法:
不要被白话题目的说法带偏了,有个思想就是。
(1)逐个字符找以它为中心的回文串,左边 ← 中心 →_→ 右边
(2)特殊情况可以优化的是中心的概念是广义的,拥有相同元素的时候是可以扩大的。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C语言完成代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * longestPalindrome(char * s)
{
int right = 0, left = 0, count = 0;
int startidx = 0;
int max_len = 0;
int i=0;
for ( i = 0; s[i] != '\0'; i += count)
{
count = 1;
left = i - 1;
right = i + 1;
while ((s[right]!='\0') && (s[i] == s[right])) // 选出重复字符
{
right++;
count++;
}
while ((left >= 0) && (s[right]!='\0') && (s[left] == s[right])) // 由中心字符向左右扩展
{
left--;
right++;
}
if (max_len < (right - left - 1))
{
max_len = right - left - 1; // 左右标记不在回文子串范围内,在外面两侧,需要减1
startidx = left + 1;
}
}
s[startidx + max_len] = '\0';
return s + startidx;
}
int main()
{
printf("可以输入的测试数据 babad 或者 cbbd\n");
char *s;
s=(char *)malloc(sizeof(char));
//scanf("%s",s); //处理不了空格
gets(s);
char *result=longestPalindrome(s);
printf("%s\n",result);
}