hihoCoder_W84 Lucky Substrings(基础做法)

【题目】

点击这里

【思路】

分两步走,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值