• 316. Remove Duplicate Letters (accumulate -> count of the difference elements in a vector)


    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 1:

    Input: "bcabc"
    Output: "abc"
    

    Example 2:

    Input: "cbacdcbc"
    Output: "acdb"

    Approach #1: C++. [brute froce]

    class Solution {
    public:
        string removeDuplicateLetters(string s) {
            int size = s.size();
            if (size == 0) return "";
            
            int l = 0;
            string ret = "";
            
            vector<int> cnt(26, 0);
            for (int j = 0; j < size; ++j) {
                cnt[s[j] - 'a'] = 1;
            }
            int total_diff = std::accumulate(cnt.begin(), cnt.end(), 0);
            
            for (int z = 0; z < total_diff; ++z) {
                for (int i = 0; i < 26; ++i) {
                    int appear = -1;
                    for (int j = l; j < size; ++j) {
                        if (s[j] - 'a' == i && ret.find('a' + i) == -1) {
                            appear = j;
                            break;
                        }
                    }
                    if (appear == -1) continue;
                    
                    vector<int> cnt2(26, 0);
                    for (int j = appear; j < size; ++j) 
                        cnt2[s[j] - 'a'] = 1;
                    for (auto c : ret) 
                        cnt2[c - 'a'] = 1;
                    int num = std::accumulate(cnt2.begin(), cnt2.end(), 0);
                    if (num == total_diff) {
                        ret += char('a' + i);
                        l = appear + 1;
                        break;
                    }
                }
            }
            
            return ret;
        }
    };
    

      

    Approach #2: C++.

    class Solution {
    public:
        string removeDuplicateLetters(string s) {
            vector<int> cand(256, 0);
            vector<bool> visited(256, false);
            
            for (auto c : s)
                cand[c]++;
            
            string ret = "0";
            
            for (auto c : s) {
                cand[c]--;
                if (visited[c]) continue;
                while (c < ret.back() && cand[ret.back()]) {
                    visited[ret.back()] = false;
                    ret.pop_back();
                }
                visited[c] = true;
                ret += c;
            }
            
            return ret.substr(1);
        }
    };
    

      

    reference:

    https://leetcode.com/problems/remove-duplicate-letters/discuss/76767/C%2B%2B-simple-solution-easy-understanding

    http://www.cplusplus.com/reference/numeric/accumulate/

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    在浏览器中浏览git上项目目录结构
    部署elasticsearch(三节点)集群+filebeat+kibana
    谷歌浏览器安装Elasticsearch-head 插件
    Logstash配置文件修改自动加载和指定目录进行启动
    使用Dbvisualizer 连接 Elasticsearch
    Elasticsearch常见用法-分布式集群
    Elasticsearch常见用法-入门
    Elastic Stack 7.5.0白金版永不过期
    配置 Nginx 反向代理 WebSocket
    ES7.3.0配置
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10203221.html
Copyright © 2020-2023  润新知