最近刷到的题:
一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回可以印出的非空字母序列的数目
输入:AAB
输出:8
(因为可印出:“A”, “B”, “AA”, “AB”, “BA”, “AAB”, “ABA”, "BAA"8种)
输入:“AAABBC”
输出:188
思路如下:A2的下标2代表个数,每次从A2B1中取出一个构成如下的树。结束条件是各个字母个数为0。用递归就可实现。
class Solution {
public int numTilePossibilities(String tiles) {
List<String> list = new ArrayList<>();
for(int i = 0 ;i<tiles.length();i++) {
list.add(tiles.substring(i,i+1));
}
Set<String> set = new TreeSet<>(list);
List<String> list2 = new ArrayList<>(set);
int arr[] = new int[set.size()];
for(int i = 0;i<set.size();i++) {
arr[i] = Collections.frequency(list,list2.get(i));
}
Result result = new Result(0);
return fuction(arr,result);
}
static int fuction(int arr[],Result result) {
int zero = 0;
for(int i = 0;i<arr.length;i++) {
if(arr[i] == 0) {
zero++;
}
else break;
}
if(zero==arr.length) {
return result.val;
}
for(int i = 0;i<arr.length;i++) {
if(arr[i] == 0) continue;
result.val++;
int arr2[] = new int[arr.length];
System.arraycopy(arr, 0, arr2, 0, arr.length);
arr2[i]--;
fuction(arr2,result);
}
return result.val;
}
}
//创建Result类使得传递参数时实现类似C的引用传值
class Result{
int val;
Result(int val){
this.val = val;
}
}