zoukankan      html  css  js  c++  java
  • 316. Remove Duplicate Letters

    问题描述:

     

    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"

    解题思路:

    这道题目很有意思啊,既要得到字符串中不重复的字符,又要让其满足最小的字母顺序,就是若有"bc"  和"cb" 同时出现,选择"cb"

    首先遍历一遍字符串记录每个字符串出现的次数。

    然后在开始从头遍历这个字符串:

      1. 首先对它出现次数进行减一。

      2.检查它是否被访问过,若被访问过,则表明它已经有合适的位置了

      3.若没有被访问过,首先和字符串尾部的字符比较大小:

        如果字符串尾部比当前字符小,则已经是从小到大的顺序了

        如果字符串尾部比当前字符大,则需要检查后面是不是还出现过这个字符:即检查它的剩余次数是否为0.

            若后面还会出现,将尾部字符的访问值设为false来访问后面的,并且取出尾部字符

      4.然后将该字符加入到字符尾部

      5.并将该字符的访问值设为true

    代码:

    class Solution {
    public:
        string removeDuplicateLetters(string s) {
            vector<int> m(256, 0);
            vector<bool> visited(256,false);
            for(char c : s){
                m[c]++;
            }
            string ret = "0";
            for(char c : s){
                m[c]--;
                if(visited[c]) continue;
                while(c < ret.back() && m[ret.back()] > 0){
                    visited[ret.back()] = false;
                    ret.pop_back();
                }
                ret += c;
                visited[c] = true;
            }
            
            return ret.substr(1);
            
        }
    };
  • 相关阅读:
    multiselect2side双向选择列表插件改进版
    通用权限管理平台--实现站点地图
    通用权限管理平台--系统日志
    通用权限案例平台--登录认证
    通用权限管理平台--代码结构
    通用权限管理平台--功能划分
    通用权限管理平台--架构选型
    tests
    Python 2.7_多进程获取简书专题数据(一)
    python2.7 爬取简书30日热门专题文章之简单分析_20170207
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9236842.html
Copyright © 2011-2022 走看看