[补题]找到原序列长度k的子序列中字典序最小的那个(单调栈)
题意
题目如题,输入序列只包含小写字母,数据范围0<k<=len<=500000。
例:
输入:helloworld
输出:ellld
题解
- 使用单调栈。当已删掉n-k个字符,输出栈中元素和剩余序列。否则当完成遍历一遍序列,输出栈底k个元素。时间复杂度O(n)。
- 我的思考
- 之前的思路是按序遍历26个字母,并遍历原序列的子区间(beg,end)其中beg是上一次找到的字符的下一个,end是不至于凑不够k的结尾处。写好并超时了。时间复杂度大概是O(k ·logn ·26)。
- 大概想的优化是排序/滑动窗口一样的东西搞成O(n),原因是单调栈并不知道什么时候用用的太少。
- 不知道怎么处理的点是找更新区间的最小字典序字符,以及字典序小但出现在结尾处的字符怎么处理(类似例子中的d)。单调栈+删掉n-k提前截止很好的处理了我两个不会处理的点。仔细体会吧。
- 起码下次要有优化到O(n)的方法考虑一波单调栈的意识。
相关知识
单调栈
- 定义:栈中的元素是按照某种方式排列,但是必须是单调的。如果某元素破坏了栈的单调性,就弹出栈的元素,直到该元素满足栈的单调性为止。
- 用途:使用单调栈可以找到元素向左遍历第一个比他小/大的元素,也可以找到元素向左遍历第一个比他大/小的元素,且时间复杂度O(n)。
单调队列
- 定义:队列单调递增或递减。不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。
- 用途:用单调队列来解决问题,一般都是需要得到当前的某个范围内的最小值或最大值。
代码
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
public class subStr {
public static void main(String args[]) {
Scanner in=new Scanner(System.in);
String str=in.next();
int k=in.nextInt();
Stack<Character> stack=new Stack<>();
int cntToDel=str.length()-k;
for(int i=0;i<str.length();++i) {
while(!stack.isEmpty()&&cntToDel!=0&&stack.peek()>str.charAt(i)) {
stack.pop();
--cntToDel;
}
//如果已经删了n-k个元素
if(cntToDel==0) {
LinkedList<Character> list=new LinkedList<>();
while(!stack.isEmpty()) {
list.add(stack.pop());
}
Collections.reverse(list);
for(Character c:list) {
System.out.print(c);
}
String tailStr=str.substring(i,str.length());
System.out.print(tailStr);
return;
}
stack.add(str.charAt(i));
}
//字符串完成了一遍遍历,输出单调栈底下的k个。
LinkedList<Character> list=new LinkedList<>();
while(!stack.isEmpty()) {
list.add(stack.pop());
}
Collections.reverse(list);
String subStr=str.substring(0,k);
System.out.print(subStr);
}
}
参考链接
https://blog.csdn.net/ljd201724114126/article/details/80663855
[补题]找到原序列长度k的子序列中字典序最小的那个(单调栈)的更多相关文章
- 转:最小区间:k个有序的数组,找到最小区间使k个数组中每个数组至少有一个数在区间中
转:http://www.itmian4.com/thread-6504-1-1.html 最小区间原题 k个有序的数组,找到最小的区间范围使得这k个数组中,每个数组至少有一个数字在这个区间范围内.比 ...
- 【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈
这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的 ...
- [luogu3246][bzoj4540][HNOI2016]序列【莫队+单调栈】
题目描述 给定长度为n的序列:a1,a2,...,an,记为a[1:n].类似地,a[l:r](1<=l<=r<=N)是指序列:al,al+1,...,ar-1,ar.若1<= ...
- [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
Description ycc 喜欢古典音乐是一个 ZJUTACM 集训队中大家都知道的事情.为了更方便地聆听音乐,最近 ycc 特意把他的家搬到了爱乐大街(德语Philharmoniker-Stra ...
- N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...
- 【补题记录】NOIp-提高/CSP-S 刷题记录
Intro 众所周知原题没写过是很吃亏的,突然发现自己许多联赛题未补,故开此坑. 在基本补完前会持续更新,希望在 NOIp2020 前填完. 虽然是"联赛题",但不少题目还是富有思 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 4.30-5.1cf补题
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
随机推荐
- Java学习之反射篇
Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...
- 最后之作-Last Order(bushi
最近化学学有机选修,讲羧酸的时候我想到一个问题:不考虑空间异构.能否稳定存在等问题,某高级饱和脂肪酸有多少种同分异构体?做为一名退役的OIer,我将它抽象为了另一个问题:含\(n\)个\(C\)的饱和 ...
- SpringBoot---SpringMVC关于拦截器的一些问题总结
SpringBoot---SpringMVC关于拦截器的一些问题总结 环境: IDEA :2020.1 Maven:3.5.6 SpringBoot: 2.3.2 1.直接在地址栏输入 http:// ...
- JS精度损失toFixed
1234*0.01=12.3400000001 很明显后缀00001跟预期想要的不一致,起初面临这个问题我的处理方式是这样的: (1234*0.01).toString().substring(0,2 ...
- 目录扫描、Nmap
一.基本定义 1.目录扫描: 扫描站点的目录,寻找敏感文件(目录名.探针文件.后台.robots.txt.备份文件等). 2.目录:站点结构,权限控制不严格. 3.探针文件:服务器配置信息,例:php ...
- java 二分查找的注意事项
二分查找也是最简单的算法之一了.但是最近发现一般的写法会有问题. public int search(int[] nums, int target) { int left = 0; int right ...
- 蓝牙bluez命令
记录一下自己平时调试蓝牙的命令,后续学习到再添加 sdptool命令: sdptool add SP - 添加SPP: sdptool add --channel=1 DID SP DUN LA ...
- CSP-J2019 NOIP普及组初赛真题(选择题部分)
NOIP初赛考试提纲 时间:10月的第2/3个星期六下午14:30~16:30 分数及形式:满分100分,形式为笔试(今年可能上机) 1.单项选择题,共15题,每题2分,共30分 2.阅读程序题,共3 ...
- CentOS7 更改默认启动桌面(或命令行)模式
centos7以后是这样的,7以前就是别的版本了 1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改 ...
- CentOS ISO 下载地址
x86_64:https://wiki.centos.org/Download ARM:http://mirror.nsc.liu.se/centos-store/altarch/ http://dl ...