2025年困难的字符串

困难的字符串如果一个字符串包含两个相邻的重复子串 则称它为容易的串 其他串称为困难的串 如 BB ABCDACABCAB ABCDABCD 都是容易的 D DC ABDAB CBABCBA 都是困难的 输入正整数 n L 输出由前 L 个字符 大写英文字母 组成的 字典序第 n 小的困难的串

大家好,我是讯享网,很高兴认识大家。

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

输入正整数n,L,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串。

例如,当L=3时,前7个困难的串分别为:

A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA

n指定为4的话,输出ABAC

思路:


讯享网

在写的时候遇到一个问题:就是当‘A’‘B’‘C’都行不通的时候就要返回上一层,如果上一层的‘A’‘B’‘C’也试了还不行,就要删除最后一个字符重新选择,但又不好写回溯条件。那么这道题到底需不需要回溯呢?我从网上看到了一句话是解释什么时候回溯什么时候不回溯,我觉得说的特别有道理,一下子让我豁然开朗。

要不增值就在递归的参数里面加,要不就回溯

#include<iostream> #include<cstring> using namespace std; int n,L; bool isHard(string s,char c){ int j = 1; for(int i = s.length() - 1; i >= 0; i-=2){ string s1 = s.substr(i, j); string s2 = s.substr(i + j) + c; if(!s1.compare(s2)){ return false; } j++; } return true; } void dfs(int cnt, string s){ if(cnt == n){ cout << s; exit(0); } for(char i = 'A'; i < 'A' + L; i++){ if(isHard(s,i)){//如果组合起来是困难的串就继续纵向递归 dfs(cnt+1, s+i); } } } int main(){ cin >> n >> L; dfs(0, ""); return 0; } 

讯享网

小讯
上一篇 2025-01-19 09:11
下一篇 2025-01-13 22:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/30135.html