zoukankan      html  css  js  c++  java
  • 回溯法,判断字符串后缀

    题意为给你一个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("
    ");
                ans++;
                if(ans==n)
                    return;
                dfs(step+1);
                if(ans==n)
                    return;
            }
        }
    }
    int main()
    {
        scanf("%d%d", &n, &k);
        dfs(1);
    }
  • 相关阅读:
    Node.js理解
    PayPal为什么从Java迁移到Node.js
    移动开发技巧总结
    Flex性能调优相关的一些总结
    Flex组件的生命周期
    Adobe Flash Builder 4.7 新功能详解
    【Django】Cookie
    【Django】路由系统
    【Django】视图系统
    【Django】ORM操作#2
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10008510.html
Copyright © 2011-2022 走看看