【DFS】困难的串

题目:  

  问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串。如: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。

代码:  

复制代码
 1 import java.util.Scanner;
 2 
 3 public class 困难的串 {
 4 
 5     public static void main(String[] args) {
 6 //        int n = 10;
 7 //        int L = 4;
 8         Scanner scanner = new Scanner(System.in);
 9         int L = scanner.nextInt();
10         int n = scanner.nextInt();
11         dfs(L, n, "");
12         // isHard("0123020120",1);
13     }
14 
15     static int count;
16 
17     private static void dfs(int l, int n, String prefix) {
18 
19         // 尝试在prefix后追加一个字符  难点一:维持字典序
20         for (char i = 'A'; i < 'A' + l; i++) {
21             if (isHard(prefix, i)) {// 是困难的串,就组合起来输出
22                 String x = prefix + i;
23                 //System.out.println(x);
24                 count++;// 计数
25                 if (count == n){
26                     System.out.println(x);
27                     System.exit(0);
28                 }
29 
30                 dfs(l, n, x);
31             }
32         }
33     }
34 
35     /**
36      *  难点二:判断prefix+i是否一个困难的串
37      *  1.遍历所有的长度为偶数的子串,看是否对称 
38      *  2.prefix本身是一个困难的串 ABACA i 往后遍历逐步比较
39      * @param prefix
40      * @param i
41      * @return
42      */
43     private static boolean isHard(String prefix, char i) {
44         int count = 0;// 截取的宽度
45         for (int j = prefix.length() - 1; j >= 0; j -= 2) {
46             final String s1 = prefix.substring(j, j + count + 1);
47             final String s2 = prefix.substring(j + count + 1) + i;
48             if (s1.equals(s2))
49                 return false;
50             count++;
51         }
52         return true;
53     }
54 }
复制代码

结果:

  

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   |旧市拾荒|  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示