Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找出一个字符串在另一个字符串中所占的百分比_C#_Algorithm_String - Fatal编程技术网

C# 找出一个字符串在另一个字符串中所占的百分比

C# 找出一个字符串在另一个字符串中所占的百分比,c#,algorithm,string,C#,Algorithm,String,我需要找出一个字符串在另一个字符串中包含多少百分比或字符。 我尝试了Levenshtein距离,但该算法返回字符串相等所需更改的字符数。 有人能帮忙吗? 我需要用c#写,但这并不重要 答案代码: 公共双最长公共子序列(字符串s1、字符串s2) { //如果任一字符串为空,则长度必须为0 if(String.IsNullOrEmpty(s1)| String.IsNullOrEmpty(s2)) 返回0 int[,] num = new int[s1.Length, s2.Length];

我需要找出一个字符串在另一个字符串中包含多少百分比或字符。 我尝试了Levenshtein距离,但该算法返回字符串相等所需更改的字符数。 有人能帮忙吗? 我需要用c#写,但这并不重要

答案代码: 公共双最长公共子序列(字符串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
int[,]num=new int[s1.Length,s2.Length];//2D数组
字符1;
字符字符2;
//实际算法
对于(int i=0;i
嗯。。。你就不能只使用需要更改的字符数吗

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

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

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

字符的顺序重要吗?您缺少示例。这个问题很模糊。我不喜欢写例子,好吧,它们是:)例如:字符串a=John Malkovich;字符串b=Joahn Mulkovich;这些字符串之间的差异为2个字符,或者它们是相同的84.6%。例2:字符串a=John Malkovich;字符串b=乔恩·马尔科维奇;他们都是84.6%的人,我希望这会有所帮助。那么
“hcivoklaM nhoJ”
呢,与
“John Malkovich”
相反。这是
0%
相似还是这
84.6%
相似?我需要一个字符串包含多少到另一个字符串中,例如“this Is Ivan Jovanov”中的“Ivan”包含100%。@Pece:Levenshtein距离会告诉你这一点。这就是为什么要将目标字符串的长度减去编辑的大小与源字符串的长度进行比较。在您的测试用例中,它应该是100%,因为您实际上没有从源字符串中删除任何字符。如果我将“Ivan”与“Ivaxxxn”进行比较,问题在于如果我使用:“(长度(目标)-更改的字符数)/长度(源)”它将返回100%,这是一个额外的约束,您应该指定。这里问题只考虑2个字符串,因此它可以在二次时间内完成。现在我正在测试这个,所以我会在几分钟内写出结果。我将用c#算法编辑这个问题。