LC2014-重複k次的最長子序列
阿新 • • 發佈:2022-02-09
2014. 重複 K 次的最長子序列
- 統計s中每個字元出現頻率
cnt
,獲得頻率大於等於k的字元,答案只會由這些字元組成,因此dfs全排列再check該排列是否符合出現k次這一條件 - 為了保證字典序,將chs逆序儲存,並從大到小列舉字串長度,遇到符合即返回答案
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 ""; } };