Algorithm 如何按字典顺序获取最小值?

Algorithm 如何按字典顺序获取最小值?,algorithm,Algorithm,我正在做一个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 res

我正在做一个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"
我不太清楚什么是字典顺序中最小的,为什么给出“cbacdcbc”,那么答案是“acdb”


提前感谢您的回答:)

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

为什么给出“bcabc”,那么答案将是“acdb”


你混淆了两个不同的例子,似乎有些误解;该示例说明,对于输入
bcabc
,预期的输出应该是
abc
,而不是
acdb
,它指的是输入
cbacdcbc

,最小的词典顺序是一种顺序关系,其中,给定s(s1)的第一个字符,字符串s小于t小于t(t1)的第一个字符,或者如果它们相等,则小于第二个字符,以此类推

因此
aaabbb
小于
aaac
,因为尽管前三个字符相等,但第四个字符
b
小于第四个字符
c

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

cbacdcbc = adbc cbacdcbc = adcb cbacdcbc = badc cbacdcbc = badc ... cbacdcbc=adbc cbacdcbc=adcb cbacdcbc=badc cbacdcbc=badc ...
由于adbc
adcb,因此您不能简单地用脑海中浮现的第一个答案回答。

显然,想要的输出必须只包含一次字母。 现在,据我所知,当最左边的字母出现在输入之前(abc?ascii?)时,您必须以最佳顺序选择字母 现在你会问为什么“acdb”比“abcd”大。我想你不会选第一个“cb”,因为你以后会选更多的c和b,但你必须选“a”,因为现在只有一个。那么你必须选c,因为在下一个b之后没有更多的“d”。这就是为什么你先选c,然后选d,因为以后不再选d了


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

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

  • 比较第一个不匹配的字母(称为词典),例如
    aacccc
    小于
    ab
    ,因为在第二个位置
    b
    已经满足(和
    a
    b
  • 首先比较字符串长度,较短的字符串被视为较小的字符串。如果字符串长度相等,则应用字典
如果已知字符串的长度,则第二个可能更快

您的问题包含小错误:

为什么给出“bcabc”,那么答案就是“acdb”


而来源是:“给定”bcabc“返回”abc“。这意味着应该返回
abc
,而不是
bca

您不能对字符重新排序。如果存在重复字符,则只能选择要删除的匹配项

bcabc
我们可以删除第一个
b
或第二个
b
,我们可以删除第一个
c
或第二个
c
。总共有四项产出:

..abc
.cab.
b.a.c
bca..
按字典顺序(字母顺序)对这四个输出进行排序:

以第一个为例:

abc

等待一秒钟可能会重复,不是吗?
adcb>adbc
?我不明白。@Geekuh。你对问题的回答写在最后一行:)
abc