C#比较字符串中的字符

Comparing characters in a string in C#

我正在尝试编写一种方法来确定仅包含字母的字符串是否是等值线图。 (等值图是一个没有重复字母的单词,无论是连续的还是非连续的。) 这是我的代码:

***static bool IsIsogram(string str)
{
    for (int i = 0; i <= str.Length; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (string.Compare("str[i]", "str[j]") == 0)
            {
                return false;
            }
            else if (string.Compare("str[i]", "str[j]") == 1)
            {
                return true;
            }
        }
    }

}

IsIsogram("Hello");***

编辑:这个怎么样:

static bool IsIsogram(string str) { 
   foreach (char c in str) { 
      for (int i = 0;i<=str.Length;i++) { 
         if (c == str[i]) { 
            return false; 
         } 
         else { 
            return true; 
         } 
      } 
   } 
} 
IsIsogram("Hello");


编辑中的代码有两个问题。首先,它只检查第一个字符并且总是 returns 一个值,而不实际检查整个字符串。该函数只有在确定该字符串不是等值线图时才应停止检查。简单来说,return true 应该是在两个循环都完成之后。


第二个问题是它检查字符串中的每个字符,包括当前字符。基本上,如果输入是“Bar”,它会首先检查是否 'B' == 'B',然后认为 B 出现了两次,而实际上它只出现了一次。要解决此问题,您需要跳过当前字符。在代码中,这看起来像 if (i == j) continue;

static bool IsIsogram(string str) { 
    for (int j = 0; j < str.Length; j++) { 
       for (int i = 0; i < str.Length; i++) { 
          if (j == i) continue;
          if (str[j] == str[i]) {
            return false; 
          }
       } 
    }
    return true;
}

这段代码也可以通过将 i 设置为 j+1 而不是 0 来优化,因为不需要检查已经检查过的字符。这也将消除在循环中检查 if (i == j) 的需要,因为如果 i >= j+1

i 永远不会等于 j

伪代码(未测试):

static bool IsIsogram(string str) { 
    for (int j = 0; j < str.Length; j++) { 
        for (int i = j + 1; i < str.Length; i++) { 
            if (str[j] == str[i]) {
                return false; 
            }
        } 
    }
    return true;
}

你真正想要做的就是在将字母设置为capital/lower进行比较后检查是否有重复字符。

static bool IsIsogram(string str)
{
    return str.ToLower().Distinct().Count() == str.Length;
}

试试这个,

string str = "hello";
int[] ival = str.Select(a => Convert.ToInt32(a)).ToArray();
Array.Sort(ival);
for(int i=0; i<ival.Count()-1; i++) 
{
 if (ival[i]==ival[i+1])
 {
  Console.WriteLine("isogram");
  break;
 }
}