蓝桥杯544-删除字符

该文章介绍了一个关于字符串处理的问题,即如何在删除指定数量的字母后得到字典序最小的单词。解决方案是采用贪心策略,从前往后选取字典序最小的字符。给出的Java代码示例展示了如何实现这一方法。
摘要由CSDN通过智能技术生成

题目描述

给定一个单词,请问在单词中删除 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();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值