[Leetcode]316.去除重复字母
贪心方法
用一个两个数组vector<int>cnt,vector<bool>in_right_place;
string res:目前符合条件的字符串,到代码结束的时候,这个res才是正确的答案
cnt数组 用于记录每个char未来会出现的次数,in_right_place数组判断这个char是否已经在正确的位置上
什么叫做未来会出现呢?
我们拿样例做为例子:
输入: "bcabc"
我们先遍历一遍所有字符串记录cnt
结果是cnt['a']=1,cnt['b']=2,cnt['c']=2,其他都为0
我们需要再遍历一遍寻找结果
现在读到第一个字符b,未来会出现的'b'的次数就减去1(因为已经出现了一次了),所以未来b只会再出现(2-1)次,这就是未来出现的次数
in_right_place判断正确位置比较好理解,我们每次读到一个未在正确位置上的字符,就可以将这个字符拿来和res比较字典序,
如果能发现存在一个新字符串使得字典序更小,则代替。
如何判断字典序更小呢?
通过这个:
while(cnt[res.back()]>0&&读取的当前字符<res.back()){
/*就能说明存在一个新序列使得字典序更小*/
in_right_place[res.back()]=false;
res.pop_back();
/*撤销正确位置的标记并将其从结果字符串弹出*/
}
还是回到样例,假设当前读取的字符为s[2],即'a',此时的res="bc"
=>‘a’比'c'字典序优先且'c'未来还会出现(即cnt['c']>0),说明存在'a'在'c'前面的搭配,所以弹出'c'并撤销'c'是正确位置的标记即in_right_place['c']=false;此时res="b"
=>‘a’比'b'字典序优先且'b'未来还会出现(即cnt['b']>0),说明存在'a'在'b'前面的搭配,所以弹出'b'并撤销'b'是正确位置的标记即in_right_place['b']=false;此时res=""
这一题的贪心在于,每次遍历会考虑后面的情况将res改变。具体实现代码如下:
C++实现代码如下:
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int>cnt();
vector<bool>in_right_place();
for(char c:s){
cnt[c]++;
}
string res="";
/*返回的字符串初始化为空*/
for(char c:s){
cnt[c]--;
if(in_right_place[c]){
/*如果已经在正确位置,则跳过*/
continue;
}else{
while(cnt[res.back()]>&&c<res.back()){
/*说明存在一个新序列使得字典序更小*/
in_right_place[res.back()]=false;
res.pop_back();
/*撤销正确位置的标记并将其从结果字符串弹出*/
}
res+=c;
in_right_place[c]=true;
/*此时c在“当前的”正确位置*/
}
}
return res;
}
};
也可以不用vector而用数组记录
class Solution {
public:
string removeDuplicateLetters(string s) {
int m[] = {}, visited[] = {};
string res = "";
for (auto a : s) m[a]++;
for (auto a : s) {
--m[a];
if (visited[a]) continue;
while (a < res.back() && m[res.back()]) {
visited[res.back()] = ;
res.pop_back();
}
res += a;
visited[a] = ;
}
return res;
}
};
[Leetcode]316.去除重复字母的更多相关文章
- Java实现 LeetCode 316 去除重复字母
316. 去除重复字母 给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次.需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 1: 输入: " ...
- 【LeetCode】316. 去除重复字母
316. 去除重复字母 知识点:栈:单调 题目描述 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次.需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 输 ...
- 316 Remove Duplicate Letters 去除重复字母
给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果.例如:给定 "bcabc"返回 "a ...
- [Swift]LeetCode316. 去除重复字母 | Remove Duplicate Letters
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- [LeetCode] Remove Duplicate Letters 移除重复字母
Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...
- [LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项
Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...
- [LeetCode] 26. Remove Duplicates from Sorted Array 有序数组中去除重复项
Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...
- [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项 II
Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...
- [leetcode]3. Longest Substring Without Repeating Characters无重复字母的最长子串
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
随机推荐
- 2019.01.26 codeforces 632E. Thief in a Shop(生成函数)
传送门 题意简述:给nnn个物件,物件iii有一个权值aia_iai,可以选任意多个.现在要求选出kkk个物件出来(允许重复)问最后得到的权值和的种类数. n,k,ai≤1000n,k,a_i\le ...
- Jquery中parentsUntil函数调用最容易犯的三个错误
来自 :http://jquery01.diandian.com/post/2012-01-16/14500044 Jquery中parentsUntil函数调用最容易犯的三个错误 Jquery的pa ...
- GDI基础(2):绘制文本
1.TextOut()和DrawText()函数 CDC::TextOut()在窗口的指定位置处输出文本,函数声明: virtual BOOL TextOut(int x, int y, LPCTST ...
- C++STL 函数对象和谓词
函数对象:重载函数调用操作符的类,其对象常称为函数对象. 函数对象属于类对象,能突破函数概念,保持类的状态 谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个, ...
- IntelliJ IDEA 2017版 Spring5最基本的bean例子创建
一.简述 SpringBoot是基于spring框架之上的快速开发的框架.Spring4核心就是容器,容器提供了对bean的装配和管理. spring依赖加载: ...
- PageInfo 前台分页js,带分页栏
在使用mybatis3,并且使用分页,PageHelper 接口,分页还是很好使用的.使用pageInfo的后台分页接口. /** * * @param switchPage方法,切换页码方法 * * ...
- js获取浏览器类型进行判断
本文为webuploader.js中学习心得,感谢开源,从中加入了ie的edge判断 /** * @description 简单的浏览器检查结果. * * * `webkit` webkit版本号,如 ...
- (动态规划)Worm -- hdu -- 2151
http://acm.hdu.edu.cn/showproblem.php?pid=2151 Worm Time Limit: 1000/1000 MS (Java/Others) Memory ...
- 在Delphi中处理word文档与数据库的互联
在Delphi中处理word文档与数据库的互联 ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具.在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可 ...
- 如何将Excel 图表导出
简单分三步: Step1: Alt+ F11 --> 调出 VBA: Step2: Ctrl+G (开关键)—>调出立即窗口: Step3: 在立即窗口输入 activesheet.C ...