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 }

 

转载于:https://www.cnblogs.com/hwd9654/p/11008562.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值