1079. Letter Tile Possibilities
1079. Letter Tile Possibilities
求一串含有重复字符的字符串的非空子序列个数?
首先,子序列的长度最短是1,最长是串长 然后对每一个长度的串的每一个字符,我们可以选串中的某一字符A,或者下一个非A字符(避免重复)
class Solution {
int fact[8] = {1, 1, 2, 6, 24, 120, 720, 5040};
int countPerm(string s) {
int l = s.size();
int cnt[26] = {};
for(auto c : s) ++cnt[c-'A'];
int fa=1;
for(int i=0;i<26;++i) {
fa *= fact[cnt[i]];
}
return fact[l]/fa;
}
void DFS(string& str, string& s, int pos, int i, int &curl, int &l, int &res) {
if (pos == curl) {
res += countPerm(s);
return;
}
if (i>=l) return;
s.push_back(str[i]);
DFS(str, s, pos+1, i+1, curl, l, res);
while(i<l-1 && str[i]==str[i+1]) ++i;
s.pop_back();
DFS(str, s, pos, i+1, curl, l, res);
}
public:
int numTilePossibilities(string tiles) {
int res = 0;
int len = tiles.size();
sort(tiles.begin(), tiles.end());
for(int i=1;i<=len;++i) {
string tmp;
DFS(tiles, tmp, 0, 0, i, len, res);
}
return res;
}
};#回溯法 #枚举