如何在字典顺序中获得最小的?

时间:2015-12-30 14:50:21

标签: algorithm

我正在做一个leetcode练习

https://leetcode.com/problems/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:
# Given "bcabc"
# Return "abc"
#
# Given "cbacdcbc"
# Return "acdb"

我不太确定what is the smallest in lexicographical order以及为什么给予" cbacdcbc"那么答案就是" acdb"

提前感谢您的回答:)

6 个答案:

答案 0 :(得分:10)

最小的词典顺序是一个顺序关系,其中字符串 s 小于 t ,给定 s的第一个字符 s 1 )小于 t 的第一个字符( t 1 ),或者他们是等同的,第二个角色等等。

因此aaabbb小于aaac,因为虽然前三个字符相同,但第四个字符b小于第四个字符c

对于cbacdcbc,有几个选项,因为bc是重复的,您可以决定删除哪些重复项。这导致:

cbacdcbc = adbc
cbacdcbc = adcb
cbacdcbc = badc
cbacdcbc = badc
...

adbc< adcb,你不能简单地回答你脑海中浮现的第一个答案。

答案 1 :(得分:3)

您无法对字符重新排序。您只能选择在重复字符的情况下要删除的事件。

bcabc

我们可以删除第一个b或第二个b,我们可以删除第一个c或第二个c。所有四个输出:

..abc
.cab.
b.a.c
bca..

按字典顺序(按字母顺序)对这四个输出进行排序:

abc
bac
bca
cab

拿第一个:

abc

答案 2 :(得分:1)

显然,想要的输出必须只包含一次字母。 现在,根据我的理解,你必须选择这些字母,以便在最左边的字母出现之前给你最好的顺序(abc?ascii?) 现在你问为什么" acdb"比不是" abcd"。我想你不会参加第一次" cb"因为你以后更多c和b,但你必须采取" a"因为现在只有一个人来。然后你必须采取c'因为没有更多" d"在下一个b之后。这就是为什么你采取c,然后d因为不再是后来的。

简而言之,您希望以最佳的词典顺序从低到高,但要确保在迭代输入字符串时获取所有字母。

答案 3 :(得分:1)

字符串比较通常可以通过两种方式完成:

  • 比较第一个不匹配的字母(称为词典编纂),例如aacccccc 少于 },因为已满足第二个位置ab(和{{ 1}}< b)。
  • 首先比较字符串长度,将较短字符串视为较少。如果字符串长度相等,则应用词典。

如果知道字符串的长度,则第二个可能更快。

您的问题包含小错误:

  

为什么给予" bcabc"那么答案就是" acdb"

虽然起源是:" 鉴于" bcabc"返回" abc" "。有意义的是,应该返回a而不是b

答案 4 :(得分:0)

the smallest in lexicographical order - 你的答案应该是初始字符串的子序列,包含每个字符的一个实例。
如果有许多这样的子序列可能(第一个例子为bca, bac, cab, abc),则返回最小的子序列,将它们作为字符串进行比较(考虑词汇表中的字符串顺序)。

why Given "bcabc" then the answer would be "acdb"
你混淆了两个不同的例子

答案 5 :(得分:0)

似乎有一些误解;该示例指出,对于输入bcabc,预期输出应为abc,而不是acdb,它指的是输入cbacdcbc