题意

题目如题,输入序列只包含小写字母,数据范围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

最新文章

  1. 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证
  2. context元素大概解说
  3. Hibernate和Struts2整合的增、删、改、查
  4. Owin SelfHost Asp.net WebApi 遇到 No type was found that matches the controller named &#39;ControllerName&#39; 异常的解决方案
  5. HTML5实战与剖析之原生拖拽(四可拖动dragable属性和其他成员)
  6. LA 3695 Distant Galaxy
  7. get the first and last collection item in Magento
  8. zabbix的Java API(一)
  9. canvas图表详解系列(2):折线图
  10. python面向对象其他相关-异常处理-反射
  11. HTTP服务及状态码
  12. Nodejs进阶:crypto模块中你需要掌握的安全基础
  13. 深入分析synchronized的实现原理
  14. 并发库应用之十三 &amp; 并发集合类的应用
  15. python3数学函数
  16. #Java学习之路——基础阶段(第五篇)
  17. WPF 如何创建自己的WPF自定义控件库
  18. 【React + flask】跨域服务及访问
  19. cv::ACCESS_MASK指定不明确的错误
  20. css3边框与背景

热门文章

  1. python设计模式之解释器模式
  2. 使用Spring Boot开发者工具进行自动重启和页面自动刷新
  3. C++ 不具有继承关系的类之间的显式,隐式转换 2013-07-11 15:41
  4. 作弊揭发者 C++
  5. Nordic52840SDK学习之定时器
  6. Linux下执行SQL文件
  7. Python的pyttsx3安装失败的解决方案
  8. 计算机网络-网络层(1)IPv4和IPv6
  9. 算法-搜索(3)AVL树
  10. 《Java从入门到失业》第三章:基础语法及基本程序结构(四):基本数据类型(字符编码和char型)