字符串比较算法C#
我必须做一个算法,比较两个字符串并返回一个布尔值 如果字符串a的所有字母都出现在字符串b中,则为真 例如,“romain”和“marion”返回true “world”和“dlrow”返回true 我的代码只有在没有重复的情况下才能工作,我不明白为什么。谢谢你的帮助字符串比较算法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) {
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;
}