如何用C#高效的统计出字符串TestStr和Str中的公共字符的个数,尽量少用foreach循环。

解决方案 »

  1.   


    string s1="asdfg";
    string s2="cvdfhjkl";
    int count=0;            
    int n = s1.Length > s2.Length ? s2.Length : s1.Length;
    for (int i = 0; i < n; i++)
      {
        if (s1.Substring(i, 1) == s2.Substring(i, 1)) //同位置字符是否相同
           {
              count++;
           }
      }
      

  2.   

    那如果TestStr =ab,Str =aab,那么2楼的算法不就计算有偏差了吗?结果应该是2,但上述方法结果只能是1.我觉得上述方法是用于计算公共子串的算法,而不是公共字符的算法,您说呢?
      

  3.   

    使用LINQ:
    var e=from m in first1 
                      from n in second2
                      where m.Equals(n)
                      select m;
    Console.WriteLine(e.count());
      

  4.   

    /// <summary>
            /// lcs算法,最长公共字串
            /// </summary>
            /// <param name="s1"></param>
            /// <param name="s2"></param>
            /// <returns></returns>
            public static string LCS(this string s1, string s2)
            {
                if (s1 == s2)
                    return s1;
                else if (String.IsNullOrEmpty(s1) || String.IsNullOrEmpty(s2))
                    return null;            var d = new int[s1.Length, s2.Length];            var index = 0;
                var length = 0;            for (int i = 0; i < s1.Length; i++)
                {
                    for (int j = 0; j < s2.Length; j++)
                    {
                        // 左上角值
                        var n = i - 1 >= 0 && j - 1 >= 0 ? d[i - 1, j - 1] : 0;                    // 当前节点值 = "1 + 左上角值" : "0"
                        d[i, j] = s1[i] == s2[j] ? 1 + n : 0;                    // 如果是最大值,则记录该值和行号
                        if (d[i, j] > length)
                        {
                            length = d[i, j];
                            index = i;
                        }
                    }
                }            return s1.Substring(index - length + 1, length);        }