題目:輸入一個字符串,求出其中最長的迴文子串。
代碼:最原始,很容易想到的版本
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 10000
//判斷是否是迴文
int Valid(char* tmp){
char s[MAXN];
int len=strlen(tmp);
int i=0;
for(;i<len;i++)
if(isalpha(tmp[i]))
s[i]=toupper(tmp[i]);
s[i]='\0';
len=strlen(s);
for (i=0;i<len-1-i;i++)
if(s[i]!=s[len-1-i]) return 0;
return 1;
}
//返回阿拉伯數字長度
int PersonLen(char* tmp){
int len=0;
while(*tmp)
if(isalpha(*tmp++)) len++;
return len;
}
int main(){
char s[MAXN],tmp[MAXN],res[MAXN];
int len,i,j,first=1;
fgets(s,MAXN,stdin);
len=strlen(s)-1; //包含了換行
for(i=0;i<len;i++)
for(j=i;j<len;j++){
memcpy(tmp,s+i,j-i+1);
tmp[j-i+1]='\0';
if(!Valid(tmp)) continue;
if(first) {first=0;strcpy(res,tmp);}
else if(PersonLen(res)<PersonLen(tmp))
strcpy(res,tmp);
}
if(!first) printf("%s\n",res);
else printf("no found\n");
return 0;
}
輸出:
上面方法時間複雜度是O(n^3),考慮書中的方法。以某個字符爲中心,向兩邊搜索。考慮aba和abba兩種類型
代碼:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 10000
int main(){
char a[MAXN],copy[MAXN],pos[MAXN];
int i=0,j=0,len,m,n,tmplen,startpos,endpos;
fgets(a,sizeof(a),stdin);
len=strlen(a);
for(;i<len;i++){
if(isalpha(a[i])){
copy[j]=toupper(a[i]);
pos[j++]=i;
}
}
//第一個字符顯然是滿足的
len=1;
startpos=0;
for(i=0;i<j;i++){
for(m=i-1,n=i+1;m>=0&&n<j;m--,n++){
if(copy[m]!=copy[n]) break;
tmplen=n-m+1;
if (tmplen>len){
len=tmplen;
startpos=m;
}
}
for (m=i,n=i+1;m>=0&&n<j;m--,n++){
if(copy[m]!=copy[n]) break;
tmplen=n-m+1;
if (tmplen>len){
len=tmplen;
startpos=m;
}
}
}
endpos=startpos+len-1;
for(i=pos[startpos];i<=pos[endpos];i++)
printf("%c",a[i]);
printf("\n");
return 0;
}
時間複雜度爲O(n^2)
網上還介紹了一種時間複雜度爲O(n)的算法,以後再寫。