题目描述:
如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”。例如, BB、ABCDABCD都是容易的串,而D、DC、ABDAD、CBABCBA都是困难的串。
输入正整数n和L,输出由前L个字符组成的、字典序第n个困难的串。例如,当L=3时,前7个困难的串 分别为A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。输入保证答案不超过80个字符。
样例输入:
7 3
样例输出:
ABACABA
题解:
public class Practice_困难的串 {
static int cnt;
public static void main(String[] args) {
int N = 7;
int L = 3;
dfs(N, L, "");
}
private static void dfs(int n, int l, String prefix) {
for (char i = 'A'; i < 'A' + l; i++) {
if (isHardString(prefix, i)) {//如果是困难的串,就组合起来输出
String x = prefix + i;
cnt++;
if (cnt == n) {
System.out.println(x);
System.exit(0);//退出
}
dfs(n, l, x);//执行下一步
}
}
}
//判断是否为困难串
private static boolean isHardString(String prefix, char i) {
int count = 0;//截取的长度
for (int j = prefix.length() - 1; j >= 0; j -= 2) {
String x1 = prefix.substring(j, j + count + 1);
String x2 = prefix.substring(j + count + 1) + i;
if (x1.equals(x2)) return false;
count++;
}
return true;
}
}