一、题目描述
给你一个字符串
s
,找到s
中最长的回文子串。
二、示例
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
三、输入输出说明
1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
四、基本思路
本题是求最长回文子串,所以可以将问题分成两部分:最长子串、回文子串
1、最长子串:
从字符串的最大长度开始,依次递减,遍历数组,寻找是否有满足条件的子串
2、回文子串:
设置两个索引,一个从头开始依次递增,一个从尾开始依次递减,逐个比较两个位置的元素是否相等:如果不相等则不为回文子串;如果全部相等则为回文子串
本题如果用c语言做,则使用数组时会经常出现数组越界的错误,所以需要特别注意数组边界限制。而且在返回结果的时候,自己重新声明一个数组char*和char[]时都出现了报错,所以我只能转而使用题目给定的数组s,在回文子串的尾部加上数组的结束标志\0,然后返回回文子串的开始位置return s+i
五、代码
C语言:
char * longestPalindrome(char * s){
int length;
for (length = strlen(s); length >= 1; length--) {
int i, flag = 0;
for (i = 0; i <= strlen(s)-length && flag == 0; i++) {
int start, end;
for (start = i, end = i+length-1; start <= i+length-1 && end >= i; start++, end--) {
if (s[start] != s[end]) {
flag = 0;
break;
}
else {
flag = 1;
}
}
if (flag == 1) {
s[i+length] = '\0';
return s+i;
}
}
}
return "";
}