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);
            
        }
    };
  • 相关阅读:
    Scripts.Render 索引超出了数组界限
    AutoFac使用方法总结
    MFC中打开一个获取路径的对话框
    MFC中自定义消息
    获得窗口句柄的方法
    App Doc View Frame中指针的获取
    MFC中菜单的命令响应顺序
    机械设计软件编写心得
    对SVD奇异值分解的理解
    安装win8+Ubuntu14.04双系统的经验总结
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9236842.html
Copyright © 2011-2022 走看看