【问题标题】:How to get the number of differences in a string comparison?如何获得字符串比较中的差异数量?
【发布时间】:2010-10-11 20:47:00
【问题描述】:

我知道我可以获取 2 个字符串的内容是否相等,但我需要能够获取比较 2 个字符串值的结果中不同的字符数。

例如:

"aaaBaaaCaaaDaaaEaaa"
"aaaXaaaYaaaZaaaEaaa"

所以这个案例的 asnwer 是 3。

有没有一种简单的方法可以做到这一点,使用正则表达式、linq 或任何其他方式?

编辑:字符串也很长。说出 10k+ 个字符。

【问题讨论】:

  • 如果它们的长度不同怎么办?
  • 问得好,那样的话,我也会数一数。
  • 插入或删除某些字母的情况如何?
  • 这些也应该算在内。因此,它实际上是在计算 1 中的所有内容,而不是其他内容。

标签: c# .net regex string comparison


【解决方案1】:

如果有插入和删除: Levenstein distance

这是C# implementation

【讨论】:

  • 嘿 Max - 底部链接已失效。因此,我们通常会要求您在答案中包含链接中的代码,以防发生这种情况。
【解决方案2】:

您可以使用 LINQ:

string a = "aaaBaaaCaaaDaaaEaaa";
string b = "aaaXaaaYaaaZaaaEaaa";

int result = a.Zip(b, (x, y) => x == y).Count(z => !z)
           + Math.Abs(a.Length - b.Length);

不过,带有循环的解决方案可能更有效。

【讨论】:

  • 谢谢,如果字符串的字符数不同,会出现这种情况吗?
  • @Joan Verge:那么你需要在结果中加上长度差。
  • 谢谢,我明白你的意思了。但在那种情况下,这并不能处理插入等相应计数,对吧?
  • @Joan Venge:是​​的,如果您需要 Levenstein 距离,而不仅仅是字符串不同的位置数(这是您最初要求的),那么我的回答没有帮助。
【解决方案3】:

嘿,看看这个:http://en.wikipedia.org/wiki/Hamming_distance

如果您想计算删除和插入,而不仅仅是替换,它将对您有所帮助。

【讨论】:

    【解决方案4】:

    我会简单地遍历字符数组,为每个差异添加一个计数器。

    但是,这不会考虑不同长度的字符串。

    【讨论】:

    • 谢谢,但字符串很长,我猜有 10k 个字符或更多。
    • 理论上不可能比这更快。循环遍历 10K 个字符并比较它们应该不会花很长时间。
    • 在这种情况下速度不是问题:O
    【解决方案5】:

    如果两个字符串的长度相同,并且没有像代理一样复杂的 Unicode 字符,则可以循环遍历每个字符,如果每个字符串中该索引处的字符不同,则增加一个计数器。

    理论上不可能更快地做到这一点。 (您需要检查每个字符)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多