Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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#_String_Algorithm - Fatal编程技术网

字符串比较算法C#

字符串比较算法C#,c#,string,algorithm,C#,String,Algorithm,我必须做一个算法,比较两个字符串并返回一个布尔值 如果字符串a的所有字母都出现在字符串b中,则为真 例如,“romain”和“marion”返回true “world”和“dlrow”返回true 我的代码只有在没有重复的情况下才能工作,我不明白为什么。谢谢你的帮助 string a = @"aka"; string b = @"aka"; bool istwin(string x, string y) {

我必须做一个算法,比较两个字符串并返回一个布尔值

如果字符串a的所有字母都出现在字符串b中,则为真

例如,“romain”和“marion”返回true

“world”和“dlrow”返回true

我的代码只有在没有重复的情况下才能工作,我不明白为什么。谢谢你的帮助

        string a = @"aka";
        string b = @"aka";

        bool istwin(string x, string y)
        {
            int compteur = 0;
            if (x.Count() == y.Count())
            {
                int index = x.Count();

                for (int i = 0; i < index; i++)
                {
                    for (int z = 0; z < index; z++)
                    {
                        Console.WriteLine(x[z] + "  comparé  à " + y[i]+"indexs : "+z+" ,  "+i);
                        if (x[z] == y[i])
                        {
                            compteur++;
                        }                         
                    }

                }
                Console.WriteLine();
                Console.WriteLine(compteur);
                if (compteur == index)
                  {
                     return true;
                  }
                   else
                   {
                    return false;
                   }

            }
            else
            {
                return false;
            }

        }

        //istwin(a, b);
        Console.WriteLine(istwin(a, b));
    }
字符串a=@“aka”;
字符串b=@“aka”;
布尔·伊斯特温(字符串x,字符串y)
{
内部计算机=0;
如果(x.Count()==y.Count())
{
int index=x.Count();
对于(int i=0;i
您可以使用
System.Linq
中的方法简化算法。由于C#中的
string
表示一个只读字符序列,因此可以获取两个序列之间的差异并检查其计数

bool-istwin(字符串x,字符串y)
{
返回x.Count()=0;
}
它将返回
true
例如字符串

Console.WriteLine(istwin(“aka”、“aka”)//返回true
Console.WriteLine(istwin(“世界”、“dlrow”)//返回true
控制台。WriteLine(伊斯特温(“罗曼”、“马里恩”)//返回true
为了涵盖这种情况,当
“a”
“aaa”
字符串应返回
false
(根据注释),您可以添加额外的字符串长度检查,如

bool-istwin(字符串x,字符串y)
{
返回x.Length==y.Length&&x.Except(y).Count()==0;
}
结果如下

Console.WriteLine(istwin(“a”、“aaa”)//返回false
Console.WriteLine(istwin(“a”、“abc”)//返回false

其他人使用LINQ给出了答案。这是一个高级编程概念。在学习C#时,您可能希望在没有LINQ的情况下完成此操作。下面是两种可能的算法


代码中的问题是(在使用2“aka”的示例中),第一个“a”在第二个“aka”中计数两次,第二个“a”也计数两次

对于“aka”和“akb”,这将为您提供正确的计数,因为它将在第二个单词中找到第一个单词的每个字母一次。这也是错误的


一种解决办法是,一旦找到第二个单词,就把它的每个字母都去掉。我们只需将字母替换为NUL字符即可:

private static bool IsAnagramRemove(string s, string t)
{
    if (s.Length != t.Length) {
        return false;
    }

    // Convert second word to char array, so we can remove matched letters.
    char[] tChar = t.ToCharArray();

    int count = 0;
    for (int i = 0; i < s.Length; i++) {
        for (int j = 0; j < tChar.Length; j++) {
            if (s[i] == tChar[j]) {
                tChar[j] = (char)0; // Remove (well.., replace by 0).
                count++;
                break; // Leave the inner loop.
            }
        }
    }
    return count == s.Length;
}
由此

return compteur == index;
因为表达式
compteur==index
生成一个表示比较结果的布尔值


另一种可能是首先对两个单词中的字母进行排序,以便您可以比较两个单词中相同位置的字母:

private static bool IsAnagramSort(string s, string t)
{
    if (s.Length != t.Length) {
        return false;
    }
    char[] a = s.ToCharArray();
    char[] b = t.ToCharArray();
    Array.Sort(a);
    Array.Sort(b);
    for (int i = 0; i < a.Length; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }
    return true;
}
私有静态bool IsAnagramSort(字符串s,字符串t)
{
如果(s.长度!=t.长度){
返回false;
}
char[]a=s.ToCharArray();
char[]b=t.ToCharArray();
数组。排序(a);
数组。排序(b);
for(int i=0;i

这里不需要计算。如果你到达循环的末尾,这意味着我们已经找到了一个字谜。

你可能需要某种类型的
可枚举的.Intersect
…你能发表文章来澄清期望值吗?以下对的结果应该是什么:{“aaa”,“a”},{“a”,“aaa”},{“a”,“abc”}?嗯,错,false和false您能否复制您需要编写的函数的确切规范?根据您的描述,即“如果字符串a的所有字母都出现在字符串b中,这是真的”,那么这些都必须是真的。例如,“aaa”中的每个“a”都出现在“a”中。请注意,这不符合OP的注释{“aaa”,“a”}->false,{“a”,“aaa”}->false,{“a”,“abc”}->false。。。还需要弄清楚他们到底在找什么。谢谢,我现在没有这个方法,太好了!这对于“aka”和“akb”仍然失败,因为它们具有相同的长度,并且所有字符都将从第一个字符串中删除。
private static bool IsAnagramSort(string s, string t)
{
    if (s.Length != t.Length) {
        return false;
    }
    char[] a = s.ToCharArray();
    char[] b = t.ToCharArray();
    Array.Sort(a);
    Array.Sort(b);
    for (int i = 0; i < a.Length; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }
    return true;
}