【问题标题】:Find out how much percent one string contains in another找出一个字符串在另一个字符串中的百分比
【发布时间】:2010-06-18 23:10:07
【问题描述】:

我需要找出一个字符串在另一个字符串中包含多少百分比或字符。 我已经尝试过 Levenshtein Distance 但该算法返回需要更改多少字符才能使字符串相等。 有人可以帮忙吗? 我在 c# 中需要它,但这并不重要。

答案代码: 公共双 LongestCommonSubsequence(字符串 s1,字符串 s2) { //如果任一字符串为空,则长度必须为0 if (String.IsNullOrEmpty(s1) || String.IsNullOrEmpty(s2)) 返回 0;

    int[,] num = new int[s1.Length, s2.Length];  //2D array
    char letter1;
    char letter2;

    //Actual algorithm
    for (int i = 0; i < s1.Length; i++)
    {
        letter1 = s1[i];
        for (int j = 0; j < s2.Length; j++)
        {
            letter2 = s2[j];

            if (letter1 == letter2)
            {
                if ((i == 0) || (j == 0))
                    num[i, j] = 1;
                else
                    num[i, j] = 1 + num[i - 1, j - 1];
            }
            else
            {
                if ((i == 0) && (j == 0))
                    num[i, j] = 0;
                else if ((i == 0) && !(j == 0))   //First ith element
                    num[i, j] = Math.Max(0, num[i, j - 1]);
                else if (!(i == 0) && (j == 0))   //First jth element
                    num[i, j] = Math.Max(num[i - 1, j], 0);
                else // if (!(i == 0) && !(j == 0))
                    num[i, j] = Math.Max(num[i - 1, j], num[i, j - 1]);
            }
        }//end j
    }//end i
    return (s2.Length - (double)num[s1.Length - 1, s2.Length - 1]) / s1.Length * 100; 
} //end LongestCommonSubsequence

【问题讨论】:

  • 字符的顺序重要吗?
  • 您缺少示例。这个问题很模糊。
  • 我不写例子很糟糕,好吧它们是:) 例如:string a = John Malkovich;字符串 b = 约翰·马尔科维奇;这些字符串之间的差异是 2 个字符,或者它们是相同的 84.6%。前任。 2:字符串 a = 约翰·马尔科维奇;字符串 b = Jonh Malkovich;他们是相同的 84.6% 希望我这会有所帮助。
  • "hcivoklaM nhoJ" 怎么样,"John Malkovich" 的反面。是0% 相似还是84.6% 也相似?

标签: c# algorithm string


【解决方案1】:

听起来您可能想要longest common subsequence,它是差异算法的基础。不幸的是,这个问题是 NP 难的,这意味着没有有效的(多项式时间)解决方案。维基百科页面有一些建议。

【讨论】:

  • 这里的问题只考虑2个字符串,因此可以在二次时间内完成。
  • 现在写我正在测试这个,所以我会在几分钟内写出结果。
  • 是的,测试进行得很顺利,谢谢。我将使用 c# 算法编辑问题。
【解决方案2】:

呃...你不能只使用需要更改的字符数吗?

(length(destination)-changed_character_count)/ length(source)

编辑:根据修改后的问题,将两个字符串视为集合,计算集合交集,并将该集合的大小和源字符串作为集合的百分比作为基础。

【讨论】:

  • 我需要一个字符串包含多少到另一个字符串中,例如“This is Ivan Jovanov”中的“Ivan”包含 100%。
  • @Pece:Levenshtein 距离会告诉你这一点。这就是为什么您将目标字符串的长度减去编辑的大小与源字符串的长度进行比较的原因。在您的测试用例中,它最终应该是 100%,因为您实际上并没有从源字符串中删除任何字符。
  • 这里的问题是,如果我将“Ivan”与“Ivaxxxn”进行比较,如果我使用:“(length(destination)-changed_character_count)/length(source)”,它将返回 100%
  • 这是您可能应该指定的附加约束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多