【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 }
结果:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
本文来自博客园,作者:|旧市拾荒|,转载请注明原文链接:https://www.cnblogs.com/xiaoyh/p/10348164.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效