Desh

LeetCode316-去除重复字母:双HashMap计数字符串

描述:

给你一个字符串s,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

1 输入:s = "bcabc"
2 输出:"abc"

思路:

1.遍历统计各字符出现个数

2.再次遍历,先判断res中字符出现次数,再进行循环判断当前s[i]是否可以前向替换

 1 class Solution {
 2 public:
 3     string removeDuplicateLetters(string s) {
 4         unordered_map<char,int>M;
 5         unordered_map<char,int>N;
 6         for(auto x:s)M[x]++;
 7         string res="";
 8         for(int i=0;i<s.size();i++){
 9             if(N[s[i]]>0){
10                 M[s[i]]--;
11                 continue;
12             }
13             if(res.size()>=1){
14                while(res.size()>0&&M[res[res.size()-1]]!=0&&s[i]<res[res.size()-1]){//前向替换条件
15                 int n=res.size();
16                 N[res[n-1]]--;//注意先更新次数;替换后M[]不变;
17                 res.erase(n-1,1);
18               }
19             }
20             res+=s[i];
21             M[s[i]]--;
22             N[s[i]]++;
23     }
24         return res;
25     }
26 };

 

复杂度分析:

时间:O(N)

空间:O(2N)

 

posted on 2022-02-08 21:45  Desh  阅读(41)  评论(0)    收藏  举报

导航