【題目】
【思路】
分兩步走,1. 找出所有斐波那契子串;2. 按字典序無重複地輸出。
第一步可以枚舉子串,由於規模比較小,O(n^2)的算法都可以接受。O(n^3)優化至O(n^2)的方法是,從前往後枚舉子串,[i…j+1]可以利用[i…j]的結果。
第二步可以選擇排序,然後無重複輸出,也可以考慮建立字典樹去重並排序,然後先序遍歷輸出。字典樹的方法將在下週貼上來。
【代碼】
#include <stdio.h>
#include <string.h>
char a[6000][101];
int ans=-1;
void push(char s[], int p, int q)
{
int i; ans++;
for (i=p;i<=q;i++) a[ans][i-p]=s[i];
a[ans][q-p+1]='\0';
}
int comp(const void *a, const void *b){return strcmp((char *)a,(char *)b);}
int main()
{
char s[110];
scanf("%s",s);
int verif[26]={0}; verif[1]=1; verif[2]=1; verif[3]=1; verif[5]=1; verif[8]=1; verif[13]=1; verif[21]=1;
int i,j,sLen=strlen(s);
for (i=0;i<sLen;i++)
{
int total=0; int check[26]={0};
for (j=i;j<sLen;j++)
{
if (check[s[j]-'a']==0){total++; check[s[j]-'a']=1;}
if (verif[total]==1) push(s,i,j);
}
}
qsort(a,ans+1,sizeof(a[0]),comp);
printf("%s\n",a[0]);
for (i=1;i<=ans;i++) if (strcmp(a[i],a[i-1])!=0) printf("%s\n",a[i]);
return 0;
}