求一个字符串中最长的回文子串
示例:abcdefgaablbaaabcdefg-->>aablbaa
思路:1、找到一个基点,以这个基点为中心,向两边扩散,需要两个指针,一个左一个右,左右相等就继续扩散,左右不相等就直接返回。
void expand(char *s,int left,int right,int *arr){
if(left<0||(right>=strlen(s))){
return;
}
while(left>=0&&right<strlen(s)&&(s[left]==s[right])){//扩展
left--;
right++;
}
if(right-left>arr[1]-arr[0]){//用arr记录子串长度最大值
arr[0]=left;
arr[1]=right;
}
return;
}
2、然后循环遍历,将字符串中的每个元素都当做基点试一下。
char*palindrome(char*s){
int len = strlen(s);
int arr[2]={0,0};
int i=0;
for(i=0;i<len;i++){
expand(s,i,i,arr);
expand(s,i,i+1,arr);
}
char*s1=(char*)malloc(arr[1]-arr[0]);
strncpy(s1,s+arr[0]+1,arr[1]-arr[0]-1);
s1[arr[1]-arr[0]-1]=0;
return s1;
}
全部代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void expand(char *s,int left,int right,int *arr){
if(left<0||(right>=strlen(s))){
return;
}
while(left>=0&&right<strlen(s)&&(s[left]==s[right])){//扩展
left--;
right++;
}
if(right-left>arr[1]-arr[0]){//用arr记录子串长度最大值
arr[0]=left;
arr[1]=right;
}
return;
}
char*palindrome(char*s){
int len = strlen(s);
int arr[2]={0,0};
int i=0;
for(i=0;i<len;i++){
expand(s,i,i,arr);
expand(s,i,i+1,arr);
}
char*s1=(char*)malloc(arr[1]-arr[0]);
strncpy(s1,s+arr[0]+1,arr[1]-arr[0]-1);
s1[arr[1]-arr[0]-1]=0;
return s1;
}
int main()
{
char s[1024]="abcdefgaablbaaabcdefg";
char*l=palindrome(s);
printf("%d\n",strlen(l));
printf("%s\n",l);
//puts(l);
return 0;
}