传送门
现在给定你一个字符串 s 以及一个整数 k,请求出 s 的字典序最小的长度为 k 的子序列。
利用单调栈维护一个栈
如果栈顶元素字典序大于当前字符的字典序,而且剩下的字符足够使得栈里的元素长度为k个,那么就把栈顶元素pop掉,而加入当前字符。
同理可以维护最大的那个字典序
#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
const int N = 5e6 + 5;
int top;
char a[N], stk[N];
int main(){
int n, k;
scanf("%s", a + 1);
n = strlen(a + 1);
scanf("%d", &k);
for(int i = 1; i <= n; i++) {
while(top > 0 && stk[top] > a[i] && (top + n - i + 1) > k) top--;
stk[++top] = a[i];
}
for(int i = 1; i <= k; i++) // 输出前面k个栈元素
printf("%c", stk[i]);
putchar('
');
return 0;
}