Middle-题目98:316. Remove Duplicate Letters

原创 2016年05月31日 19:52:00

题目原文:
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”
题目大意:
给出一个字符串,去掉其中重复的字母,并使得剩下的字符串是字典序最小的。
例如aba,可以去掉两个a中之一,得到的子串是”ab”或”ba”,要取字典序最小的”ab”.
题目分析:
参考discuss中的一个神解法,大致思路是使用两个指针模拟栈,具体细节有待研究。
源码:(language:java)

public class Solution {
    public String removeDuplicateLetters(String s) {
        /**
         * First loop: use an array cnt[] to count the number of times
         * appeared for each letter in s.
         * 
         * Second loop (Greedy): use a stack, pop() while (!stack.isEmpty()
         * && (sc = stack.peek()) >= c && cnt[sc] > 0)
         */

        int i, n = s.length();
        int[] cnt = new int[128];
        boolean[] inRes = new boolean[128]; // whether a char is in res[]
        char[] res = s.toCharArray(); // simulate a stack

        for (i = 0; i < n; i++)
            cnt[res[i]]++;

        char c, sc;
        int end = -1;
        // now cnt[c] means the remaining count of the char c
        for (i = 0; i < n; i++) {
            c = res[i];
            if (inRes[c]) {
                cnt[c]--;
                continue;
            }

            while (end >= 0 && (sc = res[end]) >= c && cnt[sc] > 0) {
                end--;
                inRes[sc] = false;
            }

            res[++end] = c;
            cnt[c]--;
            inRes[c] = true;
        }
        return String.valueOf(res).substring(0, end + 1);
    }
}

成绩:
3ms,beats 95.32%,众数7ms,9.99%
cmershen的碎碎念:
度娘上各大博客中比较流行的是这个代码:

public class Solution {
    public String removeDuplicateLetters(String s) {
        int[] cnt = new int[26];
        int pos = 0; // the position for the smallest s[i]
        for (int i = 0; i < s.length(); i++) cnt[s.charAt(i) - 'a']++;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) < s.charAt(pos)) pos = i;
            if (--cnt[s.charAt(i) - 'a'] == 0) break;
        }
        return s.length() == 0 ? "" : s.charAt(pos) + removeDuplicateLetters(s.substring(pos + 1).replaceAll("" + s.charAt(pos), ""));
    }
}

大致思路是每次去掉一个字符,取字典序较小的子串继续进行比较,但这个算法虽然是O(n)复杂度,但并不快(40ms+).因此还是想有时间认真研读一下那个3ms的解法。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

相关文章推荐

[Leetcode] 316. Remove Duplicate Letters 解题报告

题目: Given a string which contains only lowercase letters, remove duplicate letters so that ever...

leetcode 135 candy 97 Interleaving String 316 Remove Duplicate Letters

135 candy 题目大意是有n个孩子,每个孩子有一个rating值,现在需要给这n个孩子发糖果,要求如下: 每个孩子至少得到一个糖果 对于相邻的孩子的rating值高的应...

leetcode 316. Remove Duplicate Letters

Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

greedy LeetCode 316. Remove Duplicate Letters

这周主题依旧是贪心算法,按照我们依旧省时省力的做法,找了一道难度为hard并且通过率在没有做过的里面最高的,这涉及一个桶排序,感兴趣的小伙伴可以自己查查要怎么做。这次我们选到的题目是316. Remo...
  • Ardenso
  • Ardenso
  • 2017年04月22日 18:46
  • 131

leetcode -- Remove Duplicate Letters -- 还没完全理解。重点

https://leetcode.com/problems/remove-duplicate-letters/参考 http://www.hrwhisper.me/leetcode-remove-d...
  • xyqzki
  • xyqzki
  • 2015年12月11日 10:59
  • 3028

《leetCode》:Remove Duplicate Letters

题目Given a string which contains only lowercase letters, remove duplicate letters so that every lette...

Remove Duplicate Letters

题目描述: Given a string which contains only lowercase letters, remove duplicate letters so that ever...
  • yeshiwu
  • yeshiwu
  • 2016年10月07日 20:06
  • 86

LeetCode Remove Duplicate Letters

Description: Given a string which contains only lowercase letters, remove duplicate letters so that...

leetcode笔记--Remove Duplicate Letters

题目:难度(Hard) Given a string which contains only lowercase letters, remove duplicate letters so that e...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目98:316. Remove Duplicate Letters
举报原因:
原因补充:

(最多只允许输入30个字)