困难的串(Java)(dfs+回溯)

题目描述:
如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”。例如, BB、ABCDABCD都是容易的串,而D、DC、ABDAD、CBABCBA都是困难的串。

输入正整数n和L,输出由前L个字符组成的、字典序第n个困难的串。例如,当L=3时,前7个困难的串 分别为A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。输入保证答案不超过80个字符。

样例输入:
7 3
样例输出:
ABACABA

题解:

public class Practice_困难的串 {
    static int cnt;

    public static void main(String[] args) {
        int N = 7;
        int L = 3;
        dfs(N, L, "");
    }

    private static void dfs(int n, int l, String prefix) {
        for (char i = 'A'; i < 'A' + l; i++) {
            if (isHardString(prefix, i)) {//如果是困难的串,就组合起来输出
                String x = prefix + i;
                cnt++;
                if (cnt == n) {
                    System.out.println(x);
                    System.exit(0);//退出
                }
                dfs(n, l, x);//执行下一步
            }

        }
    }

    //判断是否为困难串
    private static boolean isHardString(String prefix, char i) {
        int count = 0;//截取的长度
        for (int j = prefix.length() - 1; j >= 0; j -= 2) {
            String x1 = prefix.substring(j, j + count + 1);
            String x2 = prefix.substring(j + count + 1) + i;
            if (x1.equals(x2)) return false;
            count++;
        }
        return true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值