栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

困难的字符串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

困难的字符串

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号