[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.19 bzoj5457: 城市(线段树合并)
传送门 线段树合并菜题. 题意简述:给一棵树,每个节点有bib_ibi个aia_iai民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...
- 2019.01.16 bzoj4399: 魔法少女LJJ(线段树合并)
传送门 线段树合并菜题(然而findfindfind函数写错位置调了好久) 支持的操作题目写的很清楚了,然后有一个神奇的限制c≤7c\le7c≤7要注意到不然会去想毒瘤线段树的做法. 思路: 这题只有 ...
- 关于页面传值页面的跳转,以及spring mvc 框架的流程问题
list页面 1.点击页面后,进入后台的list方法中,通过findPage()查询数据的,findPage中含有findList(): 2.如果页面没有输入查询条件,那么则显示所有数据集合,如果页面 ...
- JWT 理解
概念: JWT是json web token缩写.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证. 优点是在分布式系统中, ...
- shell 脚本学习
Shell简介 概述 Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送入内核去执行.内核是Linux系统的心脏,从开机自检就驻留在计算机的内 ...
- AngularJS封装UEditor
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- AngularJs ng-repeat用法二$parent.$index
我们在开发时时常会出现repeat嵌套使用的情况,此时会想获取父级repeat数组的下标可使用$parent.$index
- POJ3692 Kindergarten
Kindergarten Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6882 Accepted: 3402 Desc ...
- 关于jdbc连接MySQL数据问题
1.解压MySQL后配置环境变量 MYSQL_HOME:D:\win7\Program Files(x86)\mysql-5.6.21-win32(mysql根目录) 添加path:%MYSQL_HO ...
- nodeclub config
配置文件,本来想着分成好几个文件,放在一个文件夹中,后来觉得也没必要,原因是,配置文件看一遍也就记住了,分开反而显得繁琐,注释写清楚就好. // 路径模块 var path = require('pa ...