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);
            
        }
    };
  • 相关阅读:
    JQuery替换空字符串和正则表达式校验时间格式
    数据库升级,给某张表增加字段,防止重复升级时sql脚本报错
    将jar包安装到本地repository中
    springCloud集成常用组件(持续更新)
    记一次springboot配置事务@transactional失效的事故
    分布式锁实现(Redis和zookeeper)
    springCloud集成zookeper
    zookeeper学习相关
    springboot集成activeMq
    springboot集成redis
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9236842.html
Copyright © 2011-2022 走看看