【问题标题】:Similar String Comparison Algorithm相似字符串比较算法
【发布时间】:2016-05-11 08:00:57
【问题描述】:

在最近的一次采访中得到了这个问题。基本字符串比较有点扭曲。我有一个输入字符串STR1 = 'ABC'。当要比较的字符串时,我应该返回“Same/Similar”,STR2 具有这些值中的任何一个 - 'ACB' 'BAC' 'ABC' 'BCA' 'CAB' 'CBA' (即相同的字符,相同的长度和相同的否发生次数)。当时唯一的答案是继续“合并排序”或“快速排序”,因为它的复杂性是对数的。有没有其他更好的算法可以达到上述效果?

【问题讨论】:

  • 快速排序的最坏情况复杂度实际上是二次的;只是它是一种非常快速的简单算法,因此对于相当小的 n 值,它往往优于 n log n 算法。跨度>
  • 使用查找表。 O(N)。
  • 另外,最好的排序算法是平均情况下的 nlogn,而不是对数。除非我们对数据有所了解

标签: string algorithm


【解决方案1】:

对两者进行排序并比较结果是否相等,对于合理长度的字符串来说并不是一个坏方法。

另一种方法是使用从字符到出现次数的地图/字典/对象(取决于语言)。然后迭代第一个字符串,增加计数,并迭代第二个字符串,减少它们。得到负数就可以返回false

如果您的可能字符集小到足以被视为常量,则可以使用数组作为“映射”,从而导致 O(n) 最坏情况复杂度。

【讨论】:

  • 对不起,如果我误解了您的解决方案,是否意味着 str1 = "ABC", str2 = "AZBZC" 将返回 "Same / Similar"?
  • @shole:不,因为第一个 Z 会立即导致 -1。也就是说,我只是给出了一个非常高级的描述,留下一些细节需要填写。在像 C++/Java/JavaScript/Perl/Python/PHP/Ruby/Standard ML/OCaml/.Net 这样的语言/框架中,字符串的长度在 O(1) 中是可知的,您需要预先比较长度是否相等;在 Haskell 或 C 之类的语言中,您希望在迭代时跟踪长度,以便在结果不匹配时返回 false
  • 我觉得我可能误解了这个问题,如果 str1 = "ABC", str2 = "AZBZCZABC",它应该返回 "Similar" 对吗?如果是,我只是不明白你的解决方案是如何产生的,所以......没有冒犯
  • @shole:不,问题指定它只应在两个字符串具有相同长度(以及其他条件)时返回“相同/相似”。
  • 好的我现在明白了..我认为这就像在 string2 中搜索 str1 的排列...必须使用 rabin-karp 或 aho-corasick 等...为什么我想知道为什么每个人的解决方案都很简单,如 O(n)、映射、查找表......所以基本上计数排序就是答案......谢谢!!
【解决方案2】:

假设您可以使用任何语言,我会选择 python 'dictionary' 解决方案。您可以使用 2 个字典,将每个字符串的字符作为键。然后您可以比较字典并返回相应的结果。这实际上适用于字符出现多次的字符串。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 2010-10-19
    • 2011-10-20
    • 2013-05-23
    • 2011-08-17
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多