使用哈希表查找字符串中的字符

本文关键字:字符 字符串 查找 哈希表 | 更新日期: 2023-09-27 17:58:02

我决定解决在字符串中查找给定字符的问题。我用两种方法解决了这个问题:

第一个(使用哈希表将我们想要查找的字符的值保存在ASCII中):

static void Hash(string text, char[] charsToFind)
{
    Dictionary<int,char> chars = new Dictionary<int,char>();
    foreach (var letter in charsToFind)
    {
        chars[(int)letter] = letter;
    }
    foreach (var letter in text)
    {
        if (chars.ContainsKey((int)letter))
        {
            if (letter == chars[(int)letter])
            {
                Console.WriteLine("Element found at: {0}, value: {1}", (int)letter, letter);
            }
        }
    }
}

第二种方式(天真的):

static void Naive(string text, char[] charsToFind)
{
    foreach (var letter in text)
    {
        foreach (var character in charsToFind)
        {
            if ((int)letter == (int)character)
            {
                Console.WriteLine("Element found at: {0}, value: {1}", (int)letter, letter);
            }
        }
    }
}

一切都很好!我想问的问题是,哪一个更好,这个问题是否有更好的解决方案?

提前感谢!

使用哈希表查找字符串中的字符

使用LINQ:

string input = "abc";
char[] charsToFind = new[] { 'a', '1', 'b' };
IEnumerable<int> ids = charsToFind.Select(ch => input.IndexOf(ch)); // { 0, -1, 1 }

使用Hashset<T>作为通用哈希表:

HashSet<char> set = new HashSet<char>(input.ToCharArray());
...

第一种方法更好,但对于少数字符,第二种方法可能会更快。

对第一条的一些评论。在第一种情况下,使用字典涉及计算哈希和执行查找的成本。如果您知道字符是ASCII,那么可以使用数组来加快查找速度。

您可以执行"TryGetValue"只查找一次,而不是执行"ContainsKey"。