題目:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
代碼如下:
#include<stdio.h>
char* longestPalindrome(char* s) {
char *start=s;
int b=0; //判斷有沒(méi)有至少有一個(gè)回文串,否則沒(méi)有回文,返回首字符
int maxlength=0,i=0,j=1;
if(*(s+1)=='\0'){//只有一個(gè)字符的時(shí)候
return s;
}
while(*(s+i)!='\0'){
if(*(s+i)==*(s+i+1)){ //針對(duì)bb這種形式
b=1;
while(i-j>=0&&*(s+i-j)==*(s+i+j+1)){
j++; //往兩邊拓展的次數(shù)
}
if(2*j>maxlength){ //更新最大長(zhǎng)度
maxlength=2*j; //bb形式的每次往外拓展一層長(zhǎng)度是2*j
start=s+i-j+1; //記錄下最外層的位置,便于返回
}
}
j=1;//記得把j歸為原始的1
if(*(s+i)==*(s+i+2)){ //aba這種形式
b=1;
while(i-j>=0&&*(s+i-j)==*(s+i+2+j)){
j++;
}
if(2*j+1>maxlength){
maxlength=2*j+1;//aba形式長(zhǎng)度為2*j+1;
start=s+i-j+1;
}
}
i++;
j=1;
}
if(b==0){//整個(gè)字符串沒(méi)有回文
*(start+1)='\0';
return start;
}
*(start+maxlength)='\0';//這里只需要返回start到
return start; //start+length的長(zhǎng)度就可以
}
int main(){
char c[1001],*p,*q;
p=c;
scanf("%s",p);
q=longestPalindrome(p);
printf("%s",q);
}
Note:如果是回文字符串,總共有兩種形式:bb型,例如 cbbd這種形式;另外一種就是aba型,例如cabad這種形式。
ps: i-j>=0,這個(gè)條件不能少,否則數(shù)組越界啦。我就是少了這個(gè)導(dǎo)致double free or corruption (!prev): 0x00000000021bc290 這樣的錯(cuò)誤
i++;
j=1;
}
if(b==0){//整個(gè)字符串沒(méi)有回文
*(start+1)='\0';
return start;
}
*(start+maxlength)='\0';//這里只需要返回start到
return start; //start+length的長(zhǎng)度就可以
}
int main(){
char c[1001],p,q;
p=c;
scanf("%s",p);
q=longestPalindrome(p);
printf("%s",q);
}
### Note:如果是回文字符串,總共有兩種形式:bb型,例如 cbbd這種形式;另外一種就是aba型,例如cabad這種形式。
#### ps: i-j>=0,這個(gè)條件不能少,否則數(shù)組越界啦。我就是少了這個(gè)導(dǎo)致double free or corruption (!prev): 0x00000000021bc290 這樣的錯(cuò)誤