1. 程式人生 > >【DFS】困難的串

【DFS】困難的串

println ros 分享 pri 技術 截取 turn can 文字

題目:  

  問題描述:如果一個字符串包含兩個相鄰的重復子串,則稱它為容易的串,其他串稱為困難的串。如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困難的。

  輸入正整數L,n,輸出由前L個字符(大寫英文字母)組成的,字典序第n小的困難的串。
  例如,當L=3時,前7個困難的串分別為:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA。
  n 指定為4的話,輸出ABAC。

代碼:  

 1 import java.util.Scanner;
 2 
 3 public class
困難的串 { 4 5 public static void main(String[] args) { 6 // int n = 10; 7 // int L = 4; 8 Scanner scanner = new Scanner(System.in); 9 int L = scanner.nextInt(); 10 int n = scanner.nextInt(); 11 dfs(L, n, ""); 12 // isHard("0123020120",1); 13
} 14 15 static int count; 16 17 private static void dfs(int l, int n, String prefix) { 18 19 // 嘗試在prefix後追加一個字符 難點一:維持字典序 20 for (char i = ‘A‘; i < ‘A‘ + l; i++) { 21 if (isHard(prefix, i)) {// 是困難的串,就組合起來輸出 22 String x = prefix + i;
23 //System.out.println(x); 24 count++;// 計數 25 if (count == n){ 26 System.out.println(x); 27 System.exit(0); 28 } 29 30 dfs(l, n, x); 31 } 32 } 33 } 34 35 /** 36 * 難點二:判斷prefix+i是否一個困難的串 37 * 1.遍歷所有的長度為偶數的子串,看是否對稱 38 * 2.prefix本身是一個困難的串 ABACA i 往後遍歷逐步比較 39 * @param prefix 40 * @param i 41 * @return 42 */ 43 private static boolean isHard(String prefix, char i) { 44 int count = 0;// 截取的寬度 45 for (int j = prefix.length() - 1; j >= 0; j -= 2) { 46 final String s1 = prefix.substring(j, j + count + 1); 47 final String s2 = prefix.substring(j + count + 1) + i; 48 if (s1.equals(s2)) 49 return false; 50 count++; 51 } 52 return true; 53 } 54 }

結果:

  技術分享圖片

【DFS】困難的串