题目链接
题目描述
你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
注意:本题中,每个活字字模只能使用一次。
题目示例
示例1:
输入:“AAB”
输出:8
解释:可能的序列为 “A”, “B”, “AA”, “AB”, “BA”, “AAB”, “ABA”, “BAA”。
示例 2:
输入:“AAABBC”
输出:188
示例 3:
输入:“V”
输出:1
题目提示
- 1 <= tiles.length <= 7
- tiles 由大写英文字母组成
解题思路
使用深度优先搜索
由于最后返回的字符串不能重复,因此使用HashSet类型的result存储结果
定义一个isUsed数组,用来判断当前位置是否被遍历
定义DFS方法,参数是tiles, 当前形成的字符串curStr,result和isUsed
DFS实现:
如果当前字符串curStr不是空,就可以加入到结果result中
分别遍历tiles的所有字符,如果没有用过,那么就将这个位置的isUsed置为true,并且继续递归下一个位置
DFS下一个位置时使用curStr + tiles.charAt(i),这样方便回溯
最后返回result即可
代码
class Solution {
public void DFS(String tiles, String curStr, HashSet<String> result, boolean[] isUsed){
if(!curStr.isEmpty()){
result.add(curStr);
}
for (int i = 0; i < tiles.length(); i++) {
if(!isUsed[i]){
isUsed[i] = true;
DFS(tiles, curStr + tiles.charAt(i), result, isUsed);
isUsed[i] = false;
}
}
}
public int numTilePossibilities(String tiles) {
if(tiles == null){
return 0;
}
HashSet<String> result = new HashSet<>();
boolean[] isUsed = new boolean[tiles.length()];
DFS(tiles,"",result,isUsed);
return result.size();
}
}