难度:中等

题目:

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

示例 1:

输入:s = "bcabc"输出"abc"

示例 2:

输入:s = "cbacdcbc"

输出:"acdb"

提示:

  • 1 <= s.length <= 104

  • s 由小写英文字母组成

----------------------------------------

第一次看到这个题,对我来说最大的难度是题意,完全不懂,阅读理解一样,老壳疼

去掉相同的字母都好说,保持原来相对位置也忍了,但是那个字典序最小把我给整破防了,孤陋寡闻。

要是一个字典序最小把我给卡住了。

字典序其实可以说就是按照字典的排序,abcd......z 酱紫,最小呢就是要比较大小咯,两个无论等不等长的字符串(当然在这里是自己跟自己比较肯定是登场的),从第一位开始相同位数对着干,哪个字母更小的就排前面,如果相同就比较下一位,一直到最后

For Exampal:abc小于abd,小于baa,大于abb。

就这样。

那么要保持相对位置的不变,还要去掉相同的字符,O(n)是少不了的了。

就难在保持相对位置不变和去掉相同字母和字典序最小。

如果不输赢了。

如果是字符串中没有相同的字母,例如uaiodsh这种,随便来,都是输出原字符串,毕竟相对位置不变。

但是zabcza这种,就要考虑去掉相同中的哪一个,使得字典序最小。到底是先来的留着还是后面的留着。

考虑到先后问题,试着用

如果栈中不含有当前字符,先不要紧着往栈里塞,先和栈顶的比较下大小,如果栈顶的比较大,并且字符串后面还有栈顶的字符的话,那理应栈顶字符不应该要,而是取后面的。

例如:zabcza,遍历到第一个a时,z已在栈中,但是后面还有z,栈中的应该不要。

所以把栈中比当前字符小的、并且后面还有的,就弹出,直到找不到比当前字符小的为止。然后把当前字符放进栈中。

    如果栈中含有当前字符,那就不处理了。

例如:zabcza,遍历到最后一个z时,因为前面的z被踢出,所以这个会被放进。最后一个a时,虽然虽然a很小,但是前面已经把a放进了,就不处理。

 完事。

代码:

public static String smallestSubsequence(String s) {    Stackstack = new Stack<>();    // 遍历数组    for(int i=0;i        char c = s.charAt(i);        // 如果字符在栈中了就不取        if(stack.contains(c)) continue;        // 如果不在栈中,就跟栈顶的逐个比较大小,如果比栈顶小并且栈顶在后面还有重复的字符,那就后面再取        while(!stack.isEmpty() && s.indexOf(stack.peek(),i) != -1 && stack.peek() > c){            stack.pop();        }        stack.push(c);    }    // 栈内元素组成新的结果    char[] res = new char[stack.size()];    for(int i = stack.size()-1;i>=0;i--){        res[i] = stack.pop();    }    return new String(res);}

时间复杂度O(N),其中 N 为字符串长度。代码中虽然有双重循环,但是每个字符至多只会入栈、出栈各一次。

空间复杂度:O(∣Σ∣),其中 Σ 为字符集合,本题中字符均为小写字母,所以 |Σ|=26。由于栈中的字符不能重复,因此栈中最多只能有| Σ| 个字符。

------------------------------------完--------------------------------------

中分的标本

char* 去除后面几个字符_【算法打卡】去除重复字母相关推荐

  1. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...

    字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...

  2. c++去除图片上的文字_图片文字修改去除方法

    如何去掉图片中的水印文字呢?下面就与大家分享两种去掉图片水印文字的方法,希望对大家有所帮助. 方法/步骤 首先,我们利用专业的Photoshop工具打开相应的图片,如图所示: 选取仿制图章工具,按住A ...

  3. c语言char数组和short数组的区别,详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别 详解C语言中Char型指针数组与字符数组的区别 1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变 char *name[3] = { ...

  4. ML之NB:利用NB朴素贝叶斯算法(CountVectorizer/TfidfVectorizer+去除停用词)进行分类预测、评估

    ML之NB:利用NB朴素贝叶斯算法(CountVectorizer/TfidfVectorizer+去除停用词)进行分类预测.评估 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 c ...

  5. ML之NB:利用朴素贝叶斯NB算法(TfidfVectorizer+不去除停用词)对20类新闻文本数据集进行分类预测、评估

    ML之NB:利用朴素贝叶斯NB算法(TfidfVectorizer+不去除停用词)对20类新闻文本数据集进行分类预测.评估 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 class ...

  6. js 字符串删除首尾_JavaScript trim 实现去除字符串首尾指定字符的简单方法

    实例如下: String.prototype.trim = function (char, type) { if (char) { if (type == 'left') { return this. ...

  7. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符

    题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符. 给定一个字符串(不一定全为字母)A及它的长度n.请返回第一个重复出现的字符.保证字符串中有重复字符,字符串的长度小于等于500 ...

  8. c++ string 删除字符_字符串操作的全面总结(附完整代码)

    字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃.本文总结了一些构建string对象方法.修改string对象的方法.string类型的操作函数.stri ...

  9. 关于Java的char类型,字符集,字符编码三者的关系

    问题引入~~ 先描述一下,我最开始想不通的问题:我们知道,在java中有4类8种基本数据类型,其中一种就是字符型char,char代表一个字符,大小是2个字节,也就是2的16次方.而在UTF-8编码方 ...

最新文章

  1. 重磅丨We Are SocialHootsuite:2018全球数字报告
  2. java递归url目录_Java递归实现某个目录下所有文件和目录
  3. 数据挖掘学习笔记之人工神经网络(二)
  4. wxWidgets:wxRichTextFormattingDialog类用法
  5. updatebyprimarykeyselective的where条件是全部字段_ArcGIS 字段计算器
  6. how to learn html5,HTML5与CSS基础
  7. 论软件工程师的自我修养:角色、重构与质量
  8. maven java 结构_Maven标准目录结构介绍
  9. Java Spring-注解进行属性注入
  10. 分享前几年的外包经历,给正在犹豫要不要去外包的学弟学妹做参考.
  11. webstorm ubuntu下安装
  12. linux 截图软件安装,Ubuntu 安装截图工具Shutter,并设置快捷键 Ctrl+Alt+A
  13. windows7下硬盘安装linux
  14. 经纬度转XY坐标-批量转换
  15. c++工程师历年企业笔试真题汇总
  16. 在线免费制图云平台架构
  17. 《商业俏佳人》游戏体验文档
  18. openwrt软路由实现ipv6上网配置
  19. Java基础知识(一),打好基础才能写出高质量代码
  20. 数据交换平台开发之二功能需求

热门文章

  1. arcengine 图层中节点抽稀功能(c++)
  2. volatile与多线程
  3. 《深入浅出DPDK》读书笔记(六):报文转发(run to completion、pipeline、精确匹配算法、最长前缀匹配LPM)
  4. 《计算机网络》第一章:基础知识Part II
  5. uwsgi --http :8888 --wsgi-file test.py(无法部署)
  6. 解释python脚本程序的name变量及其作用_一些概念总结
  7. abcdefg顺序Java打印,全国2012年10月自考JAVA语言程序设计(一)试题及答案
  8. 一段顺序颠倒能读通的文字_钓鱼也有逻辑顺序,总是钓不到鱼的原因就在这里...
  9. https 443 怎么改成80_阿里云购买免费https证书并用nginx配置代理详解(2020年9月)...
  10. mysql数据库访问组件_mysql数据库访问组件