5893. 含特定字母的最小子序列 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
int[][] nxt;
int[] cnt;
public String smallestSubsequence(String s, int k, char letter, int repetition) {
int n = s.length();
nxt = new int[n + 1][26];
cnt = new int[n + 1];
for (int i = 0; i < 26; i++) nxt[n][i] = -1;
for (int i = n - 1; i >= 0; i--) {
cnt[i] = cnt[i + 1];
if (s.charAt(i) == letter) cnt[i]++;
for (int j = 0; j < 26; j++) nxt[i][j] = nxt[i + 1][j];
nxt[i][s.charAt(i) - 'a'] = i;
}
String ans = "";
int curLetterCnt = 0, curSIdx = 0;
for (int i = 0; i < k; i++) {
for (char ch = 'a'; ch <= 'z'; ch++) {
int chIdx = nxt[curSIdx][ch - 'a']; if (chIdx == -1) continue;
if(curLetterCnt + cnt[chIdx] >= repetition
&& curLetterCnt + (s.charAt(chIdx) == letter ? 1 : 0) + k - i -1 >= repetition
&& n- chIdx >= k - i){
ans += ch;
if(s.charAt(chIdx) == letter) curLetterCnt++;
curSIdx = chIdx + 1;
break;
}
}
}
return ans;
}
}