leetcode 316. Remove Duplicate Letters
来源:互联网 发布:linux自动化部署工具 编辑:程序博客网 时间:2024/06/08 01:07
一些感想
昨天去听了网易互娱的宣讲会,不得不说确实是中国最优秀的公司之一,也确实值得我把它作为明年找工作的目标。面试官的想表达的核心就是,要证明你是足够优秀和足够聪明的。加油!
题目描述
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”
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
题目分析
本题说实话题目是比较绕的,得多花点儿时间去理解题目意思。简单解释一下,最终的目标是去除字符串内的重复字母,并且最终得到的序是所有可能序的最小排序(所谓最小排序,就是指在相对顺序不变的情况下,得到的序是字典序中最小的)。以”cbacdcbc”为例,我们知道,可能得到的序可能有 cbad bacd acdb等(分别删除不同位置的重复字母)。我们知道acdb是满足条件的最小序。我们观察一下是如何得出上述结论的:首先,先确认第一个字符a,我们从第一个元素开始,假设是c,我们发现,在a的右侧仍然存在c,所以c必然不是第一个元素,同样的道理,b也不可能是第一个元素,但是,如果b或c只存在一个元素,那么他们就应该是最小的第一个元素(保证原序列)。所以这个问题是一个贪婪算法可以解决的问题,我们每次按上述算法找最左侧的最小元素,然后在剩下的字符中递归查找,直到字符串为空。注意,我们判断当前最小元素的条件是,某个字符出现的次数递减至0,也就是说,最小元素只可能出现在该字符当前位置之前,这与我们先前的分析吻合。
代码实现(贪婪算法)
class Solution {public: string removeDuplicateLetters(string s) { // greedy solution if(s.empty()) return ""; vector<int> greedy(26,0); for(auto v:s) greedy[v-'a']++; int pos = 0; for(int i = 0;i<s.size();++i) { if(s[i]<s[pos]) pos = i; if(--greedy[s[i]-'a'] == 0) break; } char ret = s[pos]; string recusive; for(int i = pos+1;i<s.size(); ++i) { auto val = s[i]; if(val == ret) continue; recusive+=val; } return ret+removeDuplicateLetters(recusive); }};
- Leetcode 316. Remove Duplicate Letters
- Leetcode 316. Remove Duplicate Letters
- leetcode 316. Remove Duplicate Letters
- 316. Remove Duplicate Letters LeetCode
- LeetCode 316. Remove Duplicate Letters
- leetcode.316. Remove Duplicate Letters
- LeetCode 316. Remove Duplicate Letters
- [leetcode]316. Remove Duplicate Letters
- leetcode 316. Remove Duplicate Letters
- leetcode 316. Remove Duplicate Letters
- leetcode 316. Remove Duplicate Letters
- leetcode Remove Duplicate Letters
- leetcode: Remove Duplicate Letters
- LeetCode Remove Duplicate Letters
- 《leetCode》:Remove Duplicate Letters
- Leetcode: Remove Duplicate Letters
- leetcode--Remove Duplicate Letters
- [Leetcode]Remove Duplicate Letters
- 自底向上的归并排序算法
- 学习认识HTML基础入门day02
- 一个入职一年半的bios的第一篇博客
- Java 去除字符串两端空格(或其他符号) 自己实现trim()
- JavaWeb中JSP的基本语法和隐含对象
- leetcode 316. Remove Duplicate Letters
- vue中点击button会刷新页面
- Linux文件I/O概述
- 什么是视图
- leetcode 304. Range Sum Query 2D
- java--set
- Android之屏幕方向|显示方式|Activity重建问题|横竖屏切换不同的布局
- add-apt-repository PPA
- 利用document.implementation.createHTMLDocument创建新的document