【DFS练习】困难的串

简介: 【DFS练习】困难的串

题目描述:

果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”。例如,

BB、ABCDABCD都是容易的串,而D、DC、ABDAD、CBABCBA都是困难的串。
输入正整数n和L,输出由前L个字符组成的、字典序第n个困难的串。例如,当L=3时,前7个困难的串

分别为A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。输入保证答案不超过80个字符。

题目思路:

  • 这道题从题目要求入手,看到困难的串的定义,可以想到:在组合成下一个串之前,先检查当前从A开始哪一个字母可以跟前缀构成困难的串。
  • 我们需要假设在执行当前检查的时候,前面组成的串都是困难的串,迭代时只需向后检查,不需要检查前面的。

代码:

#include<iostream>
#include<string>
using namespace std;
//维持字典序:能深着走绝不横着走,先不考虑平行状态
int cnt = 0;
//可以画图理解以下代码,主要代码为dfs部分
bool isHard(string prefix, char i){
  int width = 1, count = 0;
  for(int j = prefix.length()-1; j >= 0; j -= 2){
    const string s1 = prefix.substr(j,width);
    const string s2 = prefix.substr(j+count+1)+i;
//    cout << endl << "prefix:" << prefix << "\ti:" << i << "\ts1:" << s1 << "\ts2:" << s2 << "\ts1.compare(s2):" << s1.compare(s2) << endl << endl;
    if(s1.compare(s2) == 0) return false;
    width++; count++;
  }
  return true;
}
void dfs(int l, int n, string prefix){
  for(char i = 'A'; i < 'A'+l; i++){  //从第一个字母开始往后
    if(isHard(prefix,i)){     //和前面已经组合好的困难的串组合之后是否为困难的串
      string s = prefix+i;    //如果是就让前缀加上这个字母,把这个再当前缀
      cout << s << endl;
      if(++cnt == n){       //达到指定数目,退出
        cout << endl;
        exit(0); 
      }
      dfs(l, n, s);       //继续向下深搜
    }
  }
}
int main(){
  int l, n;
  cin >> n >> l;
//n = 40, l = 3;
  dfs(l, n, "");
  return 0;
}
相关文章
|
安全 网络安全 数据安全/隐私保护
网络ACL
网络ACL 网络ACL(Access Control List)是一种网络安全机制,用于控制网络中数据流的进出和传递。它基于规则列表,定义了允许或拒绝通过网络设备(如路由器、防火墙)的数据流。 网络ACL通常用于限制或过滤特定类型的流量,以实现对网络资源和服务的保护和管理。它可以根据不同的条件对数据流进行过滤,如源IP地址、目标IP地址、源端口、目标端口、协议类型等。 下面是网络ACL的一些常见应用场景和功能: 1. 访问控制:网络ACL可以设置规则,限制特定IP地址或子网访问某些网络资源。例如,可以设置拒绝来自某个IP地址的所有入站流量,或者只允许特定子网的流量通过。
1004 0
|
存储
汇编语言中“$”的作用
汇编语言中“$”的作用
2420 0
汇编语言中“$”的作用
|
9月前
|
JSON 文字识别 测试技术
Qwen2.5-VL Cookbook来啦!手把手教你怎么用好视觉理解模型!
今天,Qwen团队发布了一系列展示 Qwen2.5-VL 用例的Notebook,包含本地模型和 API 的使用。
2906 22
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
287 7
|
域名解析 网络协议 虚拟化
如何绘制PAD图和N-S图(详细步骤)
如何绘制PAD图和N-S图(详细步骤)
2103 0
|
算法
【数据结构】树、二叉树与堆(长期维护)(2)
【数据结构】树、二叉树与堆(长期维护)(2)
【数据结构】树、二叉树与堆(长期维护)(2)
|
Ubuntu 安全 网络协议
|
Ubuntu Shell 数据安全/隐私保护
Ubuntu18.04没有WiFi怎么解决(图文详解)
Ubuntu18.04没有WiFi怎么解决(图文详解)
5492 0
Ubuntu18.04没有WiFi怎么解决(图文详解)
|
算法 定位技术 C语言
推箱子游戏(算法设计)
推箱子游戏(算法设计)
357 0