5. 最长回文子串
2019-03-13 本文已影响0人
yahibo
难度:中等
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: “cbbd"
输出: “bb"
Java实现:
public class topic5 {
public static void main(String[] args) {
String s = "abcdbbfcba";
String result = longestPalindrome(s);
System.out.println(result);
}
public static String longestPalindrome(String s) {
if(s==null||s.length()==0)return "";
int start=0,end=0;
for(int i=0;i<s.length();i++) {
int len1 = expandCenter(s,i,i);
int len2 = expandCenter(s,i,i+1);
int len = len1>len2?len1:len2;
if(len>(end-start)) {
start = i-(len-1)/2;
end = start+len;
}
}
String str = s.substring(start, end);
return str;
}
public static int expandCenter(String s, int left, int right) {
int l = left;
int r = right;
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
l--;
r++;
}
return r - l - 1;
}
}
C语言实现:
//反回字符串长度
int expandCenter(char*s, int left, int right);
char* longestPalindrome(char* s);
int main(int argc, const char * argv[]) {
@autoreleasepool {
char* string = "bb";
// char* string = "abacdfgdcaba";
// char* string = "babaddtattarrattatddetartrateedredividerb";
// char* string = "zeusnilemacaronimaisanitratetartinasiaminoracamelinsuez";
char* s = longestPalindrome(string);
printf("s:%s",s);
printf("\n");
}
return 0;
}
char* longestPalindrome(char* s) {
int start = 0,end=0;
long length = strlen(s);
if (s==NULL||length==0) {
return "";
}
for (int i=0; i<length; i++) {
int len1 = expandCenter(s,i,i);
int len2 = expandCenter(s,i,i+1);
int len = len1>len2?len1:len2;
if (len>end-start) {
start = i-(len-1)/2;
end = start+len;
}
}
char* result = (char*)malloc(sizeof(char)*(end-start+1));
int k=0;
for (int i=start; i<end; i++) {
result[k] = s[i];
k++;
}
result[k] = '\0';
return result;
}
//反回字符串长度
int expandCenter(char*s, int left, int right){
int l = left;
int r = right;
long length = strlen(s);
while (l>=0&&r<length&&s[l]==s[r]) {
l--;
r++;
}
return r-l-1;
}