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;
    }
};

#回溯法 #枚举