String 相似字符串比较算法

String 相似字符串比较算法,string,algorithm,String,Algorithm,在最近的一次采访中得到了这个问题。基本字符串比较有点扭曲。我有一个输入字符串,STR1='ABC'。我应该返回“Same/similor”当要比较的字符串时,STR2具有以下任何值—“ACB”“BAC”“ABC”“BCA”“CAB”“CBA”(即相同的字符、相同的长度和相同的出现次数)。当时唯一的答案是继续进行“合并排序”或“快速排序”,因为它的复杂性是对数的。是否有其他更好的算法来实现上述结果?对两者进行排序,并比较结果是否相等,对于长度合理的字符串来说,这是一种不错的方法 另一种方法是使用映

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

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

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


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

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

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


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

如果可以使用任何语言,我会选择python“字典”解决方案。可以使用两个字典,每个字符串的字符都有键。然后您可以比较字典并返回相应的结果。这实际上适用于具有多次出现的字符的字符串。

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

快速排序的最坏情况复杂性实际上是二次的;这只是因为它是一个非常快速和简单的算法,所以它往往比n log n算法表现得更好,因为n的值非常小。使用查找表。O(N)。此外,最好的排序算法是平均情况nlogn,而不是对数。除非我们知道一些数据,否则快速排序的最坏情况复杂性实际上是二次的;这只是因为它是一个非常快速和简单的算法,所以它往往比n log n算法表现得更好,因为n的值非常小。使用查找表。O(N)。此外,最好的排序算法是平均情况nlogn,而不是对数。除非我们对数据有所了解,否则如果我误解了您的解决方案,是否意味着str1=“ABC”,str2=“AZBZC”将返回“相同/相似”?@shole:No,因为第一个
Z
将立即导致-1。也就是说,我只是给出了一个非常高级的描述,留下了一些细节需要填写。在C++/Java/JavaScript/Perl/Python/PHP/Ruby/Standard ML/OCaml/.Net这样的语言/框架中,字符串的长度在O(1)中是已知的,您需要预先比较长度是否相等;在Haskell或C这样的语言中,您希望在迭代时跟踪长度,以便在结果不匹配时返回
false
。我觉得可能是我误解了这个问题,如果str1=“ABC”,str2=“AZBZCZABC”,它应该返回“相似”对吗?如果是的话,我只是不明白你的解决方案是如何产生的……不offense@shole:否,问题指定,如果两个字符串具有相同的长度(以及其他条件),则只应返回“相同/相似”。好的,我现在知道了。我认为这就像在string2中搜索str1的排列作为模式一样…必须使用rabin karp或aho corasick,这就是为什么我想知道为什么每个人的解决方案都很简单,比如O(n),映射,查找表…所以基本上计数排序就是答案…谢谢!!抱歉,如果我误解了您的解决方案,这是否意味着str1=“ABC”,str2=“AZBZC”将返回“相同/相似”?@shole:No,因为第一个
Z
将立即导致-1。也就是说,我只是给出了一个非常高级的描述,留下了一些细节需要填写。在C++/Java/JavaScript/Perl/Python/PHP/Ruby/Standard ML/OCaml/.Net这样的语言/框架中,字符串的长度在O(1)中是已知的,您需要预先比较长度是否相等;在Haskell或C这样的语言中,您希望在迭代时跟踪长度,以便在结果不匹配时返回
false
。我觉得可能是我误解了这个问题,如果str1=“ABC”,str2=“AZBZCZABC”,它应该返回“相似”对吗?如果是的话,我只是不明白你的解决方案是如何产生的……不offense@shole:否,问题指定,如果两个字符串具有相同的长度(以及其他条件),则只应返回“相同/相似”。好的,我现在知道了。我认为这就像在string2中搜索str1的排列作为模式一样…必须使用rabin karp或aho corasick,这就是为什么我想知道为什么每个人的解决方案都很简单,比如O(n),映射,查找表…所以基本上计数排序就是答案…谢谢!!