类似题目 78 子集、 90 子集 II
1. 题目
你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
示例 1:
输入:"AAB"
输出:8
解释:可能的序列为 "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA"。
示例 2:
输入:"AAABBC"
输出:188
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-tile-possibilities
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 回溯,按照字符串长度sublen从1到n,分别进行n次回溯
- 每次回溯退出条件:字符长度达到sublen
- 避开重复:后面跟left相同的字符跳过,不同的字符与left位置字符交换
- 下一次递归时,left+1,curlen+1
class Solution {
public:
int numTilePossibilities(string tiles) {
int kinds = 0;
sort(tiles.begin(), tiles.end());
for(int sublen = 1; sublen <= tiles.size(); ++sublen)
{
bt(tiles,kinds,0,tiles.size()-1,sublen,0);
}
return kinds;
}
void bt(string tiles, int &kinds, int left, int right, int sublen, int curlen)
{
if(curlen == sublen)
++kinds;
else
{
for(int i = left; i <= right; ++i)
{
if(i > left && tiles[i] == tiles[left])
continue;
swap(tiles[left],tiles[i]);
bt(tiles,kinds,left+1,right,sublen,curlen+1);
}
}
}
};