题目地址:
https://leetcode.com/problems/letter-tile-possibilities/description/
给定一个长 n n n的字符串 s s s,求其所有不同的非空子排列的个数。
思路是DFS,每一层枚举当前我们要添加在尾部的字符。最关键的问题是去重,去重的思路和https://blog.csdn.net/qq_46105170/article/details/104272863是一样的。DFS树里每一个节点都是个方案,但最后要把空方案去掉。代码如下:
class Solution {
public:
int numTilePossibilities(string s) {
sort(s.begin(), s.end());
int res = 0;
dfs(0, s, res);
return res - 1;
}
// u表示已经选了多少个字符
void dfs(int u, string& s, int& res) {
res++;
if (u == s.size()) return;
for (int i = 0; i < s.size(); i++) {
if (i && s[i] == s[i - 1] && s[i - 1] != ' ') continue;
if (s[i] == ' ') continue;
char ch = s[i];
s[i] = ' ';
dfs(u + 1, s, res);
s[i] = ch;
}
}
};
时间复杂度 O ( n ! ) O(n!) O(n!),空间 O ( n ) O(n) O(n)。