【问题标题】:Compare if two or more chars are different in two strings [closed]比较两个或多个字符在两个字符串中是否不同[关闭]
【发布时间】:2015-12-22 22:27:53
【问题描述】:

我想比较两个或多个字符在两个字符串中是否不同。 例如

var string1 = "test1" 
var string2 = "trsz1"

现在我想检查一下,如果这 2 个字符串中 >= 2 个字符不同,它应该输出 false。 你会怎么做?

【问题讨论】:

  • 您是否尝试逐个比较这些字符串中的字符(第一个字符与第一个字符,第二个与...)?
  • 你试过什么? StackOverflow 不是代码编写服务。它是为了帮助解决现有的编程问题。请阅读How to Ask
  • 是的,这将是一个选项
  • 我有一个 Programm 代码,但知道我想比较字符串以将它们排序为 false 或 true
  • @daaemoon 你的输入字符串大小一样吗?

标签: c# string char compare


【解决方案1】:

该算法称为 Levenshtein Distance

public static int ComputeLevenshteinDistance(string strA, string strB)
{
    if (string.IsNullOrEmpty(strA) || string.IsNullOrEmpty(strB))
    {
        return Math.Max(strA == null ? 0 : strA.Length, strB == null ? 0 : strB.Length);
    }
    int[,] iArray = new int[strA.Length + 1, strB.Length + 1];
    for (int i = 0; i <= strA.Length; i++)
    {
        iArray[i, 0] = i;
    }
    for (int i = 0; i <= strB.Length; i++)
    {
        iArray[0, i] = i;
    }
    int iCost;
    int[] iMin = new int[3];
    for (int i = 1; i <= strA.Length; i++)
    {
        for (int j = 1; j <= strB.Length; j++)
        {
            iCost = (strA[i - 1] == strB[j - 1]) ? 0 : 1;
            iMin[0] = iArray[i - 1, j] + 1;
            iMin[1] = iArray[i, j - 1] + 1;
            iMin[2] = iArray[i - 1, j - 1] + iCost;
            iArray[i, j] = iMin.Min();
        }
    }
    return iArray[strA.Length, strB.Length];
}

所以你可以这样做..

string string1 = "test1" ;
string string2 = "trsz1";

bool IsDifferent = ComputeLevenshteinDistance(string1, string2) >= 2;

ComputeLevenshteinDistance 计算将 string1 转换为 string2 所需的更改次数。如果你想把一个转折算作一次改变,你需要 Damerau Levenshtein Distance

【讨论】:

  • 我的错..将ComputeLevenshteinDistance(string1, string2) &gt; 2更改为ComputeLevenshteinDistance(string1, string2) &gt;= 2
【解决方案2】:

如果字符串总是相同的长度,这很容易:

var count = 0;
for(var i = 0; i < string1.Length; i++)
{
  if(string1[i] != string2[i]) count++;
}
return count < 2;

【讨论】:

    【解决方案3】:
    var string1 = "test1" ;
    var string2 = "trsz1";
    
    string1.Zip(string2, (x, y) =>  x.Equals(y)).Where(c=>!c).Count() >= 2
    
    
    Console.WriteLine(string1.Zip(string2, (x, y) =>  x.Equals(y)).Where(c=>!c).Count() >= 2);  
    

    您还应该了解zip 约束/限制。

    该方法遍历两个输入序列,应用函数 resultSelector 到两个序列的对应元素。这 方法返回一系列值,这些值由 结果选择器。 如果输入序列的数量不同 元素,该方法组合元素,直到它到达一个结尾 的序列。 例如,如果一个序列有三个元素,并且 另一个有四个,结果序列只有三个元素。

    工作Demo

    【讨论】:

      【解决方案4】:

      但现在我想比较字符串以将它们排序为 false 或 true

      如果你的字符串大小相同,你可以试试这个:

      var string1 = "test1";
      var string2 = "trsz1";
      
      var result = string1.Zip(string2, (f, s) => f == s ? true : false).ToList();
      //result: true, false, true, false, true
      
      var ifTwoOrMoreDifferent = result.Count(i => i == false) > 1;
      

      如果您的输入大小不同,那么您的最后一行可以修改如下:

      var lengthDif = Math.Abs(string1.Length-string2.Length);
      var ifTwoOrMoreDifferent = result.Count(i => i == false) + lengthDif > 1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多