算法作业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
原创粉丝点击