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

98版本QQ五笔词库转98版万能五笔词库

QQ五笔输入法词库,转万能五笔输入法词库
  • dongdong2980
  • dongdong2980
  • 2017年03月17日 09:50
  • 873

rman的duplicate复制数据库

duplicate 最近公司准备迁移数据库,迁移的办法有很多,由于考虑到生产系统的安全性和停机时间等其他因素,选择的方案有很多,这里我们谈一下rman的duplicate: 11g的rman dupl...
  • freedompuge
  • freedompuge
  • 2016年05月09日 15:58
  • 1101

LETTERS(搜索题)

LETTERS Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%I64d & %I64u SubmitStatus ...
  • cs_zlg
  • cs_zlg
  • 2013年01月26日 13:55
  • 1144

rpm 安装报错:[is a duplicate] 重复安装

# yum install python-devel Loaded plugins: fastestmirror, priorities Loading mirror speeds from cach...
  • reyleon
  • reyleon
  • 2013年07月26日 14:45
  • 2887

【LeetCode-面试算法经典-Java实现】【219-Contains Duplicate II(包含重复元素II)】

【219-Contains Duplicate II(包含重复元素II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月29日 06:36
  • 3289

服务代码 *99#、 *98*1# 、 *98*2#的区别

*99#    *99***1#   *99***2#    *98*1#    。。。。都有什么区别啊。请教大家了。。。 还有这个调制解调器的额外初始化命令: at+cgdcont=1,...
  • ztsinghua
  • ztsinghua
  • 2015年05月06日 15:35
  • 552

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY'

mysql主键设置成auto_increment时,进行并发性能测试出现主键重复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql...
  • kingofworld
  • kingofworld
  • 2014年09月28日 15:45
  • 3783

duplicate symbol问题引发的一些知识

概括: 文件中重复定义了一个函数、变量(比如全局变量) 工程中包含同名的文件。 一般的解决方法 1 在使用import 引入头文件时,由于疏忽,误引入.m 文件。 2 同名文件放在...
  • u010828718
  • u010828718
  • 2016年08月08日 21:17
  • 2087

南阳OJ 题目98:成绩转换

题目信息:题目链接 成绩转换 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述输入一个百分制的成绩M,将其转换成对应的等级,具体转换...
  • qq_36631076
  • qq_36631076
  • 2017年04月23日 22:46
  • 111

iOS开发第三方库之间出现duplicate symbol时的处理方法

今天做项目遇到第三方库与当前项目代码冲突到问题。发现是第三方库中使用了GDataXMLNode,而我的APP项目中的微信开发部分也用到了GDataXMLNode。这就造成了冲突,产生了duplicat...
  • fww330666557
  • fww330666557
  • 2016年03月02日 17:31
  • 1842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目98:316. Remove Duplicate Letters
举报原因:
原因补充:

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