其他分享
首页 > 其他分享> > LC2014-重复k次的最长子序列

LC2014-重复k次的最长子序列

作者:互联网

2014. 重复 K 次的最长子序列

class Solution {
public:
    string s; int k;
    bool check(string &t){
        int cnt = 0;
        for(int i = 0, j = 0; i < s.size(); ++i){
            if(s[i] == t[j]) j++;
            if(j == t.size()) j = 0, cnt ++;
        }
        return cnt >= k;
    }
    bool dfs(vector<char> &chs, const int len, string &t, int used){
        if(t.size() == len){
            if(check(t)) return true;
            return false;
        }
        for(int i = 0; i < chs.size(); ++i){
            if(!(used >> i & 1)){
                t.push_back(chs[i]);
                if(dfs(chs, len, t, used | (1 << i))) return true;
                t.pop_back();
            }
        }
        return false;
    }
    string longestSubsequenceRepeatedK(string _s, int _k) {
        s = _s, k = _k;
        vector<int>cnt(26);
        vector<char>chs;
        for(auto x : s) ++cnt[x - 'a'];
        for(int i = 25; i >= 0; --i) //get 频率大于k的字符 倒序排序
            while(cnt[i] / k){
                chs.push_back(i + 'a');
                cnt[i] -= k;
            }
        for(int len = chs.size(); len >= 1; --len){ // 枚举长度
            string t = "";
            if(dfs(chs,len,t,0)) return t;
        }
        return "";
    }
};

标签:cnt,return,LC2014,len,长子,int,chs,序列,size
来源: https://www.cnblogs.com/Ivessas/p/15873109.html