zoukankan      html  css  js  c++  java
  • Remove Duplicate Letters -- LeetCode

    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:

    Given "bcabc"
    Return "abc"

    Given "cbacdcbc"
    Return "acdb"

    思路:采用贪心算法,对于给定的字符串S,找到所有结果的最小前缀(即最小的字母),假如有多个最小前缀,则选择最左侧的。

    令最终选择的最小前缀的下标为pos,则删掉s[pos]左侧的所有字符,并删掉剩下字符串中所有与s[pos]相等的字符。

    C++中将某个特定字符从所有出现的位置删掉可以这样实现:

    s.erase(remove(s.begin(), s.end(), theCharacterNeedtoRemove), s.end());

    其中remove函数需要使用algorithm库文件。算法复杂度为O(26 * n) = O(n)

     1 class Solution {
     2 public:
     3     string removeDuplicateLetters(string s) {
     4         vector<int> alp(26, -1);
     5         for (int i = 0, n = s.size(); i < n; i++)
     6             alp[(int)(s[i] - 'a')] = i;
     7         int pos = -1;
     8         for (int i = 0, n = s.size(); i < n; i++)
     9         {
    10             int ind = (int)(s[i] - 'a');
    11             if (alp[ind] == -1) continue;
    12             if (pos == -1 || s[pos] > s[i]) pos = i;
    13             if (alp[ind] == i) break;
    14         }
    15         if (s == "" || pos == -1) return "";
    16         char cand = s[pos];
    17         s = s.substr(pos + 1);
    18         s.erase(remove(s.begin(), s.end(), cand), s.end());
    19         return cand + removeDuplicateLetters(s);
    20     }
    21 };
  • 相关阅读:
    Mybatis简单的入门之增删改查
    循环的角度求均值
    谈谈软件设计
    秒杀多线程第四篇 一个经典的多线程同步问题
    (转)dp动态规划分类详解
    P1006 传纸条
    P1005 矩阵取数游戏
    1D1D动态规划优化
    NOI 2009A 诗人小G
    P1078 文化之旅
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5134881.html
Copyright © 2011-2022 走看看