leetcode 1079 Letter Tile Possibilities


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM