lc1079 Letter Tile Possibilities
利用遞歸解決
觀察題目給出的例子
AAB 按照長度分
A, B
AA, AB, BA
AAB, ABA, BAA
不難發現,長度為n的解可由長度為n-1的解推出
利用遞歸,每次長度為n的解可以遞歸了化簡至長度為1
而且為了避免記錄組合結果以用來每次比較組合成的結果是否曾經出現過,例如AA和AB都可以生成AAB。
我們需要寫遞歸時將每次的增量,即新增字母,固定為26個字母,而不是剩下字母的次數。
舉例來說,當調用到最底層長度為1,只剩一個B時,他的上一層是長度為2,但是還剩兩個A,顯然,只能用一次A作為增量,而不能按照字母剩下的次數,計算兩次+A。
1 class Solution { 2 public int numTilePossibilities(String tiles) { 3 if(tiles.length() == 0) 4 return 0; 5 int[] count = new int[26]; 6 7 for(char c : tiles.toCharArray()) 8 count[c-'A']++; 9 return dfs(count); 10 } 11 12 private int dfs(int[] array){ 13 int sum = 0; 14 15 for(int i=0; i<26; i++){ 16 if(array[i] == 0) 17 continue; 18 19 sum++; 20 array[i]--; 21 sum += dfs(array); 22 array[i]++; 23 } 24 return sum; 25 } 26 }