316. Remove Duplicate Letters
Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Example:
Given "bcabc"
Return "abc"
Given "cbacdcbc"
Return "acdb"
解题思路:
abccdab
第一步:字母去重abcdab
第二步:map中存放{d=3, b=5, c=2, a=4}
第三步:拼接输出
原理:第一个元素一定会出现在0到2之间(因为字符串中最后一次出现c的位置为2,如果0到2之间没有出现一个元素,那么拼接的字符串将不会有c这个字符)
0到2之间一定会出现角标为2处的元素大于1次,并且角标为2处的元素为当前拼接的字符串中最大的。
根据这个原理来控制b与end的值并且选择(b,end]中最小的元素,拼接字符串。
public class Solution {
public String removeDuplicateLetters(String s) {
// 字母去重
Character old=null;
Character newc;
StringBuilder stb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
newc = s.charAt(i);
if (old!=newc) {
stb.append(newc);
}
old = newc;
}
s = stb.toString();
// 利用map的自动覆盖得到最后出现的字母角标键值对
Map<Character,Integer> map = new HashMap<Character,Integer>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), i);
}
int len = map.size();
// 利用StringBuilder来拼接输出
StringBuilder sb = new StringBuilder();
int b=0;
int end = findMinValue(map);
Character val = findKeyByValue(map,end);
while (sb.length()<len) {
Character minc='z'+1;
for (int i = b; i <= end; i++) {
Character cm = s.charAt(i);
if (cm<minc&&cm<=val&&map.containsKey(cm)) {
minc = cm;
b=i+1;
}
}
sb.append(minc+"");
// 从map中删除
map.remove(minc);
if(minc == val){
end = findMinValue(map);
val = findKeyByValue(map,end);
}
}
return sb.toString();
}
public Character findKeyByValue(Map<Character,Integer> map,int val){
for (Map.Entry<Character,Integer> entry: map.entrySet()) {
if (entry.getValue()==val) {
return entry.getKey();
}
}
return null;
}
public int findMinValue(Map<Character,Integer> map){
int minkey = Integer.MAX_VALUE;
for (Integer index : map.values()) {
if (index<minkey) {
minkey = index;
}
}
return minkey;
}
}
此题的关键在于第30行代码处:对每一个将要输出的字母范围进行限制。
316. Remove Duplicate Letters的更多相关文章
- 贪心:leetcode 870. Advantage Shuffle、134. Gas Station、452. Minimum Number of Arrows to Burst Balloons、316. Remove Duplicate Letters
870. Advantage Shuffle 思路:A数组的最大值大于B的最大值,就拿这个A跟B比较:如果不大于,就拿最小值跟B比较 A可以改变顺序,但B的顺序不能改变,只能通过容器来获得由大到小的顺 ...
- leetcode@ [316] Remove Duplicate Letters (Stack & Greedy)
https://leetcode.com/problems/remove-duplicate-letters/ Given a string which contains only lowercase ...
- 316. Remove Duplicate Letters (accumulate -> count of the difference elements in a vector)
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- leetcode 316. Remove Duplicate Letters
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- [LeetCode] 316. Remove Duplicate Letters 移除重复字母
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- 【leetcode】316. Remove Duplicate Letters
题目如下: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...
- 【LeetCode】316. Remove Duplicate Letters 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 316 Remove Duplicate Letters 去除重复字母
给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果.例如:给定 "bcabc"返回 "a ...
- Remove Duplicate Letters
316. Remove Duplicate Letters Total Accepted: 2367 Total Submissions: 12388 Difficulty: Medium Given ...
随机推荐
- AES--高级数据加密标准
AES--高级数据加密标准 对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上 ...
- sql ROW_NUMBER() 排序函数 (转)
1使用row_number()函数进行编号:如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Cus ...
- vuejs,router
接下来我们要做的是vue的路由处理,首先当然是安装: npm install vue-router 接下打开我们的main.js,引入我们vue-router,然后在告诉vue我们要使用我们的vue- ...
- Linux上分析java程序的问题
通过日志看不出来的问题,可以通过看java的堆栈信息(dump文件)来看出一些端倪. 1. 找java的进程id.jdk/bin的目录 ps -ef | grep java 2. cd 到bin的目录 ...
- 异步|同步&阻塞|非阻塞
异步|同步:区别在于发出一个功能调用时,是否马上得到返回结果 阻塞|非阻塞:区别在于调用结果返回之前,当前线程是否挂起 node.js:单线程.异步非阻塞模型 单线程与异步不矛盾,与并发是矛盾的 ht ...
- Python单链表实现
class Node(): def __init__(self,InitDate): self.Date=InitDate self.next=None def setNext(self,newnex ...
- dubbo入门示例
前提准备: 在本次实验之前,需要准备一下几个包: Spring中的aop.beans.context.core.expression以及struts中的commons-logging.javassis ...
- TFS 自动同步Server 端文件的批处理命令
TFS 自动同步Server 端文件的批处理命令 目前在我们组的工作中很多时候需要将TFS上Server端的代码自动无人值守的同步到本地中来, 找到了一些解决方案的资料http://bbs.scmro ...
- MongoDB常用操作
(备注: 对于 window, 不需要sudo) 验证成功与否: * 启动服务器: $sudo mongod --dbpath C:\data\db (需要 指明数据库存放的目录) * 打开shell ...
- Maven依赖版本冲突的分析及解决小结
1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...