算法作业13
来源:互联网 发布:爽肤水怎么用 知乎 编辑:程序博客网 时间:2024/06/03 15:44
题目地址:https://leetcode.com/problems/remove-duplicate-letters/#/description
题目描述: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.
我的代码:
class Solution {public: string removeDuplicateLetters(string s) { int a[26]={0}; int hv[26]={0}; for(char c : s){ a[c-'a']++; } string str=""; for(char c:s){ a[c-'a']--; if(hv[c-'a']) continue; while(str.size()>0&&str[str.size()-1]>c&&a[str[str.size()-1]-'a']>0) { hv[str[str.size()-1]-'a']=0; str.pop_back(); } str+=c; hv[c-'a']=1; } return str; }};
解题思路:
先看一些简单的事实,对于两个连续的字符,如果前面的字符比后面的大,而且在这两个字符后面的子串中还有与前面的字符相同,那么前面的字符一定会被删除,删除后最终的结果不变,原因是相较于留下前面的字符,留下后面的相同字符其结果更小。
而现在就根据这一事实来求解这个题目。第一步要确定在在第k个字符后还有哪些字符,显然需要从k=0开始统计,遍历s记录即可。而对于之后的k+1,只需在k的基础上减去自己。
然后,有了这一统计结果,先构造空串str,在遍历s逐步修改str。对于第k步(k从0开始,对应于s的第k个字符),基于前面的事实,当该字母已经在str中存在时,易知无需理会。而当不存在时,先根据前面的事实删除掉str的末尾的字符直到不符合该事实的条件,然后将该字符加在str的末尾即可。
由于只遍历s,复杂度为O(n).
0 0
- 算法作业13
- 算法设计作业13
- Week 13算法分析作业
- 算法作业
- 算法作业
- 算法作业
- 算法作业
- 算法作业
- 【算法作业13】LeetCode 338. Counting Bits
- 算法作业_30(2017.6.13第十七周)
- 作业调度算法
- 算法第一次作业
- 算法作业方案
- 算法设计作业;贪心;
- 算法作业记录
- 作业调度算法
- 作业调度算法
- 算法课作业
- Android--通过Intent使用Bundle如何传递对象
- MySQL 服务无法启动 或 启动慢
- C语言基础知识 梳理总结
- tar -zxvf 和 cp文件时报错
- CCPC 2016-2017 Finals
- 算法作业13
- HDU
- socket的accept函数解析
- Kingbase和PostgreSQL中如何查看当前连接的进程信息
- OpenCV 玩九宫格数独(二):knn 数字识别
- 论坛自动灌水(HTTP协议)--GET请求与POST请求的发送
- sizeof结构体
- IDEA激活码及webstorm
- Bash内置命令test测试文件部分选项