题目:  

  问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串。如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的。

  输入正整数L,n,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串。
  例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA。
  n 指定为4的话,输出ABAC。

代码:  

 import java.util.Scanner;

 public class 困难的串 {

     public static void main(String[] args) {
// int n = 10;
// int L = 4;
Scanner scanner = new Scanner(System.in);
int L = scanner.nextInt();
int n = scanner.nextInt();
dfs(L, n, "");
// isHard("0123020120",1);
} static int count; private static void dfs(int l, int n, String prefix) { // 尝试在prefix后追加一个字符 难点一:维持字典序
for (char i = 'A'; i < 'A' + l; i++) {
if (isHard(prefix, i)) {// 是困难的串,就组合起来输出
String x = prefix + i;
//System.out.println(x);
count++;// 计数
if (count == n){
System.out.println(x);
System.exit(0);
} dfs(l, n, x);
}
}
} /**
* 难点二:判断prefix+i是否一个困难的串
* 1.遍历所有的长度为偶数的子串,看是否对称
* 2.prefix本身是一个困难的串 ABACA i 往后遍历逐步比较
* @param prefix
* @param i
* @return
*/
private static boolean isHard(String prefix, char i) {
int count = 0;// 截取的宽度
for (int j = prefix.length() - 1; j >= 0; j -= 2) {
final String s1 = prefix.substring(j, j + count + 1);
final String s2 = prefix.substring(j + count + 1) + i;
if (s1.equals(s2))
return false;
count++;
}
return true;
}
}

结果:

  

【DFS】困难的串的更多相关文章

  1. 困难的串(dfs)

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

  2. UVA129 Krypton Factor 困难的串 dfs回溯【DFS】

     Krypton Factor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  3. uva129 - Krypton Factor 7.4.3 困难的串

      7.4.3困难的串 学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出 //7.4.3 困难的串 #include<cstdio> #include<cstrin ...

  4. UVA - 129 Krypton Factor (困难的串)(回溯法)

    题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检 ...

  5. ACM题目————困难的串

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

  6. Krypton Factor 困难的串-Uva 129(回溯)

    原题:https://uva.onlinejudge.org/external/1/129.pdf 按照字典顺序生成第n个“困难的串” “困难的串”指的是形如ABAB, ABCABC, CDFGZEF ...

  7. UVA 129困难的串【DFS】

    题目链接 题目大意: 给出n,l:要求按特定格式输出由前l个大写字母构成的按字母表排列的第n个没有连续重复子串的字符串以及该字符串长度. 此题是一道dfs递归回溯的基础题,难点在于对当前字符串是否有连 ...

  8. UVa 129 Krypton Factor困难的串 (dfs 递归搜索)

    回溯法,只需要判断当前串的后缀,而不是所有的子串 #include<iostream> #include<cstdio> using namespace std; ]; int ...

  9. UVa 129 困难的串

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. HBuilderx中编译sass文件

    安装scss/sass编译插件 工具 -> 插件安装 -> scss/sass编译插件 将sass编译成css 新建scss文件,编写完成后,(右键scss文件 -> 外部命令/插件 ...

  2. tf的一些基本用法

    1.tf.where https://blog.csdn.net/ustbbsy/article/details/79564828 2.tf.less   tf.less(x,y,name=None) ...

  3. htmlunit+fastjson抓取酷狗音乐 qq音乐链接及下载

    上次学了jsoup之后,发现一些动态生成的网页内容是无法抓取的,于是又学习了htmlunit,下面是抓取酷狗音乐与qq音乐链接的例子: 酷狗音乐: import java.io.BufferedInp ...

  4. break退出循环分析

    函数功能: 查找dest字符串中连续不包含在src字符串中的字符数量 1 #include<stdio.h> #include<stdlib.h> void strccspn( ...

  5. Flink RichSourceFunction应用,读关系型数据(mysql)数据写入关系型数据库(mysql)

    1. 写在前面 Flink被誉为第四代大数据计算引擎组件,即可以用作基于离线分布式计算,也可以应用于实时计算.Flink的核心是转化为流进行计算.Flink三个核心:Source,Transforma ...

  6. sql server实现简繁转换

    /*--调用示例 gb_to_big和big_to_gb表存放着常用的简繁字 --可以百度到常用的简体汉字,然后用excel转换成繁体  再导入数据库. --转换为繁体 select dbo.f_GB ...

  7. 简易promise的实现(一)

    code 最近在思考promise的实现原理 于是准备自己写一个简单的demo 一开始想到的问题有两个 1.链式调用 2.异步顺序执行 -------------------------------- ...

  8. 局域网IP地址

    A类: 10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址). 127.X.X.X是保留地址,用做循环测试用的. B类: 172.16.0.0---172.31.255 ...

  9. Python Trick —— 命令行显示

    1 应用场景 在命令行展示下,有以下两种场景. 进度条显示.在同一行展示不断的更新的进度条. 信息显示/隐藏控制.比如希望向多个用户展示不同信息,各个用户彼此保密. 2 进度条展示 跟c语言类似,打印 ...

  10. 怎样使用C# MD5加密来增强密码的安全度

    一.前言 MD5说明http://zh.wikipedia.org/wiki/MD5 .NET MD5类 官方文档&示例http://msdn.microsoft.com/zh-cn/libr ...