7.9 dfs竞赛题-----困难的串


import java.util.Scanner;

public class Main {
 /*
	 *思路:每次按字典序往前缀中加字母,如果合法,就将字母加入,并打印 和 记录当前的已找到的困难串顺序
	 *(1)dfs(prefix) 初始时前缀prefix=""
	 *		依次按序遍历前l个大写字母
	 *			判断将当前字母加入前缀后是否合法(即是否为困难串)
	 *				如果合法,则将该字母加入前缀,并打印 和 cnt++(记录已找到困难串的个数)
	 *				继续dfs(新的prefix);在新的困难串上继续搜索
	 *(2)合法性:isHard(prefix,c) 判断将字符c加入prefix后,该串是否为困难串
	 *    从相邻重复串的长度len为1开始进行判断
	 *    例如:prefix=ABC  c=A
	 *        重复长度为1: C(j=2) 与  A
	 *        重复长度为2:AB(j=0) 与 CA
	 *        若用j记录C和AB的开始坐标。初始j=prefix.length-1,更新j=j-2
	 *        
	 *        
  */
	static int n;//找出第n小的困难串
	static int l;//困难串由前l个大写字母组成
	static int cnt=0;//记录已找到的困难串数目
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		l = sc.nextInt();
		n = sc.nextInt();
		dfs("");
	}
	
	private static void dfs(String prefix) {
		
		//(1)依次遍历每个字符,判断加入前缀prefix后,是否为困难串
		for(char i='A';i<'A'+l;i++) {
			if(isHard(prefix,i)) {//(1.1) 满足要求,prefix+i为空难串
				String x = prefix+i;//(1.2)获取新的前缀,并打印输出
				cnt++;
				System.out.println(x);
				if(cnt==n) {//找到第n个困难串
					System.exit(0);
				}
				dfs(x);//(1.3)x作为新的前缀,继续查找
			}
		}
		
	}

	private static boolean isHard(String prefix, char i) {
		//(1)依次比较相邻子串长度为1,...,(prefix.len+1)/2时,是否重复
		int len=1;
		for(int j=prefix.length()-1;j>=0;j-=2) {//例如prefix=ABC i=A
			String s1 = prefix.substring(j,j+len);
			String s2 = prefix.substring(j+len)+i;
			len++;
			if(s1.equals(s2)) return false;//出现相邻重复子串
		}
		
		return true;
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值