diff --git a/2014. Longest Subsequence Repeated k Times b/2014. Longest Subsequence Repeated k Times new file mode 100644 index 0000000..7d0a4af --- /dev/null +++ b/2014. Longest Subsequence Repeated k Times @@ -0,0 +1,53 @@ +class Solution { +public: + bool isKRepeatedSubsequence(const string& s, const string& pattern, int k) { + int pos = 0, matched = 0; + int m = pattern.size(); + + for (char ch : s) { + if (ch == pattern[pos]) { + pos++; + if (pos == m) { + pos = 0; + matched++; + if (matched == k) return true; + } + } + } + return false; + } + + string longestSubsequenceRepeatedK(string s, int k) { + vector freq(26, 0); + for (char ch : s) freq[ch - 'a']++; + + vector candidates; + for (int i = 25; i >= 0; --i) { + if (freq[i] >= k) candidates.push_back('a' + i); + } + + queue q; + string ans = ""; + + for (char ch : candidates) { + q.push(string(1, ch)); + } + + while (!q.empty()) { + string curr = q.front(); q.pop(); + + if (curr.size() > ans.size() || (curr.size() == ans.size() && curr > ans)) { + if (isKRepeatedSubsequence(s, curr, k)) ans = curr; + } + + if (curr.size() == 7) continue; + + for (char ch : candidates) { + string next = curr + ch; + if (isKRepeatedSubsequence(s, next, k)) q.push(next); + } + } + + return ans; + } +};