题目描述
给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
输入描述
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。
其中,单词长度不超过 100100,t 小于单词长度。
输出描述
输出一个单词,表示答案。
输入输出样例
示例 1
输入
LANQIAO
3
输出
AIAO
解法:贪心法
根据题目的意思,假设字符串长度为length,删掉n个字符,使其编程字典序最小的。我们可以反过来,让我们删掉n个,也就是说最后字符串中剩下length-n个字符,那我们可以变成在这length个字符里边从前往后选出length-n个字符来构成最终的答案,每次都选择那个字典序最小的即可。
因为前边的优先级要大于后边的字母,从前往后选,下边以题目给的实例为例子:
LANQIAO中删除3个,也就是说,我们要从前往后选出四个字符。
下面我们先选第一个,第一个可以在哪些字符中选呢?
可想而知,我们只能在LANQ中选一个最小的作为第一个字符,因为如果再往后选,比如选到了I,那就剩下两个字符AO可以给后边3个字符去选了,明显不够,所以我们在LANQ中选一个最小的作为第一个字符,这四个字符里边,A是字典序最小的,那么我们选A。
接下来选择第二个字符 ,那么第二个字符可以在哪些范围里选呢?
答案是可以在NQI中选,原理同上,因为第一个选了A,所以A之后的到I都是可以选的,这次我们选的是I。
第三、第四个字符同理。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str=scan.next();
int num=scan.nextInt();
//flag记录最后被选的是哪个字符,下一次就从这个字符的下一个开始选
int flag=0;
for(int i=0;i<str.length()-num;i++){
char temp=str.charAt(flag);
for(int j=flag;j<=num+i;j++){
if(str.charAt(j)<temp){
flag=j;
temp=str.charAt(j);
}
}
System.out.print(str.charAt(flag));
flag++;
}
scan.close();
}
}
![](https://img-blog.csdnimg.cn/img_convert/abb2f675230de96b9c4cfad01078c86f.png)