回溯法,判断字符串后缀

题意为给你一个n,k让你输出由前k个字母组成的第n个困难字符串,困难字符串就是没有任何两个相邻的字串完全相同,例如BB,ABCDABCD不是,而A AB ABA ABAC ABACA ABACAB ABACABA为困难的串

例如当n=7,k=3时输出ABACABA。

解决这个问题就是要避免重复的判断,当已经判断好长度为len的字符串为困难字符串时,再判断长度为len+1的字符串时只需要比较len+1的字符串的所有后缀字符串是否产生重复即可,例如ABAC先比较后C和A,然后再比较AC AB。

#include<bits/stdc++.h>
using namespace std;
int n,l;
char a[1000];
bool ok(int n, char a[])
{
    for(int cnt=1; cnt*2<=n; cnt++)
    {
        int flag=0;
        for(int k=0; k<cnt; k++)
        {
            if(a[n-k]!=a[n-k-cnt])
            {
                flag=1;
            }
        }
        if(flag==0)
            return false;
    }
    return true;
}
int ans=0;
void dfs(int step)
{
    if(ans==n)
        return;
    for(int i=1; i<=k; i++)
    {
        a[step]='a'+i-1;
        if(ok(step,a))
        {
            for(int j=1; j<=n; j++)
                printf("%c", a[j]);
            printf("\n");
            ans++;
            if(ans==n)
                return;
            dfs(step+1);
            if(ans==n)
                return;
        }
    }
}
int main()
{
    scanf("%d%d", &n, &k);
    dfs(1);
}

猜你喜欢

转载自www.cnblogs.com/dongdong25800/p/10008510.html
今日推荐