文章目录
- 1. 题目
- 2. 解题
类似题目 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);}} }
};