题目:
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
代码:
//思路:
//字符串为1时,返回字符串唯一的字符
//字符串大于1时,没有相同字符时,返回第一个字符
//字符串大于1时,有对称的时,返回最长回文子串
#define max(a,b) ((a>b)?(a):(b))
int function(char *s, int l, int r, int len)
{
while(l>=0&&r<len&&s[l]==s[r])
{
l--;
r++;
}
return r-(l+1);//逻辑可以参照一个样例计算,例如cbbd,当i=1时,跳出循环时,l=0,r=3
}
char * longestPalindrome(char * s){
int len = strlen(s);
if(len == 1 || len == 0)
{
return s;
}
int i = 0, k = 0, num = 0, tl = 0, tr = 0;
int oneNum = 0, twoNum = 0;
for(i=0;i<len;i++)
{
oneNum = function(s, i, i, len); //情况1:i为中心i的两边对称,例如aba
twoNum = function(s, i, i+1, len); //情况2:i和i+1对称,例如bb
num = max(max(oneNum, twoNum), num);//情况1和情况2返回的长度找最大值,与原来的最大值对比,找出最大值
//重新赋值,回文字符串的始末下标
if(num > tr-tl+1)
{
tl = i-(num-1)/2; //注意这里的numnum-1,为什么?只知道bb情况会影响tl值
tr = i+num/2;
}
}
printf("%d %d %d %c %c",num, tl, tr, s[tl], s[tr]);
char *temp = (char *)malloc(sizeof(char)*(num+1));
memcpy(temp, s+tl, sizeof(char)*num);
temp[num] = '\0';
return temp;
}