题目描述:PIPIOJ (c语言)
PIPI有一个字符串S,现在它想刁难刁难一下聪明的你,首先它给你一个整数K,要你找出字典序最小的字符串T,并且字符串T满足:
1. T由S的子序列构成.(如S="abcde",则串"ace","bcd","ade"都由S的子序列构成)
2. T的长度为K.
思路:考察字典序的概念。算法关键在于找k个最小字典序字符串,初始化从前倒数k个数开始,每次加入一个数,同时记录并取出基于上次队列中最小的数的位置。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100005
int main(){
int k;
char s[N];int ans[N]; //ans数组保存依次从‘队列s’中取出的最小字符下标
int front,rear,top=0,min;
while(scanf("%d",&k)!=EOF){
scanf("%s",s);
int len=strlen(s);
front=0,rear=len-1-k;top=0; //注意对每组输入,ans的top需要初始化
for(int i=1;i<=k;i++){ //k轮循环每次队尾加入一个数
rear++;
min=front;
for(int i=front;i<=rear;i++)if(s[i]<s[min])min=i; //找队列中min的位置
front=min+1;
ans[top++]=min; //取新的队头位置于min的下一个下标
}
for(int i=0;i<top;i++){
printf("%c",s[ans[i]]);
}
printf("\n");
}
return 0;
}