【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;
}
相关文章
|
6月前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
6月前
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
7月前
|
存储 算法
算法题解-同构字符串
算法题解-同构字符串
|
7月前
【每日一题Day257】LC2178拆分成最多数目的正偶数之和 | 贪心
【每日一题Day257】LC2178拆分成最多数目的正偶数之和 | 贪心
35 2
|
7月前
|
算法 JavaScript 测试技术
动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本
动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本
|
7月前
|
算法 Java C++
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
85 0
|
7月前
|
算法 Java
给定一个字符串数组,如何找到其中最长的回文子串? 要求:编写一个Java函数,输入一个字符串数组,输出其中最长的回文子串。要求时间复杂度为O(n^2)。可以考虑使用动态规划或中心扩展的方法来优化算法。
给定一个字符串数组,如何找到其中最长的回文子串? 要求:编写一个Java函数,输入一个字符串数组,输出其中最长的回文子串。要求时间复杂度为O(n^2)。可以考虑使用动态规划或中心扩展的方法来优化算法。
88 1
|
算法 索引
【算法挨揍日记】day08——30. 串联所有单词的子串、76. 最小覆盖子串
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = [&quot;ab&quot;,&quot;cd&quot;,&quot;ef&quot;], 那么 &quot;abcdef&quot;, &quot;abefcd&quot;,&quot;cdabef&quot;, &quot;cdefab&quot;,&quot;efabcd&quot;, 和 &quot;efcdab&quot; 都是串联子串。 &quot;acdbef&quot; 不是串联子串,因为他不是任何 words 排列的连接。
389 0
|
数据采集 算法 C++
DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
1120 0
|
算法 测试技术
算法强化每日一题--倒置字符串
算法强化每日一题--倒置字符串