题目
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
思想:
一个字符肯定符合回文子串,从长度为2直到整个字符串的长度依次进行回文子串的判断。类似一种从里往外扩的思想。
话不多说直接上代码。
char * longestPalindrome(char * s){
int s_len = strlen(s);
int max_num = 1;
int j = 0;
int start_i = 0;
char *result;
int L = 0;
if(s_len < 2)
{
return s;
}
bool drome_data[s_len][s_len];
for(int i = 0;i<s_len;i++)
{
drome_data[i][i] = 0; //长度为1时都是回文子串
}
for(L = 2; L <= s_len ;L++)
{
for(int i = 0; i < s_len ;i++)
{
j = L + i - 1; //记得做超限判断
if(j >= s_len)
{
break;
}
//printf("s[i]=%c,s[j]=%c\r\n",s[i],s[j]);
if(s[i] != s[j]) //i和j为两边的边界
{
drome_data[i][j] = false;
}
else
{
if(j - i < 3)
{
drome_data[i][j] = true;
}
else
{
drome_data[i][j] = drome_data[i+1][j-1];
}
}
if(drome_data[i][j] && j - i +1 > max_num)
{
max_num = j - i + 1;
start_i = i ;
}
}
}
printf("max_num=%d\r\n",max_num);
result = &s[start_i];
result[max_num] = '\0';
return result;
}