使用C#查找字符串中的第一个非重复字符

时间:2013-11-18 01:36:46

标签: c# linq

我正在努力解决这个问题。我必须在字符串中找到第一个非重复的字符。

例如,       输入:“teeter”       输出:r

我将首先使用HashTables:

class Program
{
    static void Main()
    {
        var inputString =  “teeter” ;
        Hashtable hashtable = new Hashtable();
        int numb = 1; 
        for (int i=0; i< inputString.length(); i++)
        {   
             if (!hashtable.ContainsKey(hashtable[i])) 
                 hashtable.Add(hashtable[i], numb);
             else  
                 hashtable[hashtable[i]] = hashtable[i].Value+ 1 ;
        }
    }
}

我可以使用LinQ来解决这个问题:

numb = inputString.First(1 == inputString.Where(item => 
                              item == hashtable[i]).Count());

我的问题是:

- 我必须使用LINQ并使用HashTables或Dictionaries来解决这个问题。我的解决方案真的可以吗?

5 个答案:

答案 0 :(得分:3)

// throws an ArgumentNullException if s is null.
// throws an InvalidOperationException if there is no non repeating character.
char FirstNonRepeater(string s)
{
    return s.ToLookup(c => c).First(g => g.Count() == 1).Key;
}

答案 1 :(得分:1)

我认为你根本不需要HashTable。因为string实现了IEnumerable<char>,所以您可以直接在输入字符串上使用LINQ:

var letter = input.GroupBy(x => x).First(g => g.Count() == 1).Key;

返回 HashTable 解决方案。你没有正确使用它。 HashTableDictionary不同。它没有key / value,只有key个。您在这里寻找Dictionary

var inputString =  "teeter";
var dict = new Dictionary<char, int>();
int numb = 1; 
for (int i=0; i< inputString.length(); i++)
{   
     if (!dict.ContainsKey(inputString[i])) 
         dict.Add(inputString[i], numb);
     else  
         dict[inputString[i]] += 1;
}

答案 2 :(得分:1)

对于没有HashTables,Dictionaries或LINQ的解决方案,只需从字符串中删除重复的字符:

while (s.IndexOf(s[0], 1) != -1) {
  s = s.Replace(s[0].ToString(), "");
}
char result = s[0];

答案 3 :(得分:0)

您可以检查哪些字符只出现一次,然后从这些字符中取出第一个。

var inputString =  “teeter” ;
var output = inputString.GroupBy(x=>x).FirstOrDefault(x=>x.Count() ==1).Key;

答案 4 :(得分:0)

class Program
    {
       public static void Main(string[] args)
        {
            Console.WriteLine(FirstNonRepeated("tether"));
           Console.ReadKey();
        }

        public static char? FirstNonRepeated(string word)
        {
           char[] chararray= word.ToCharArray();
            Hashtable hashtable=new Hashtable();
            foreach (var c in chararray)
            {
                if (hashtable.ContainsKey(c))
                {
                    hashtable[c]=(int)hashtable[c]+1;
                }
                else
                {
                    hashtable.Add(c,1);
                }
            }
            foreach (var v in chararray)
            {
                if ((int) hashtable[v] == 1)
                {
                    return v;
                }
            }
            return null;
        }


    }