如何降低“isUniqueString”的空间复杂度

时间:2014-02-08 14:34:17

标签: c#-4.0

我写了以下isUniqueCharsInString

public static bool isUniqueCharsInString(String str)
        {
            int[] charsCount = new int[256];
            for (int i = 0; i < charsCount.Length; i++)
            {
                charsCount[i] = 0;
            }
            for (int i = 0; i < str.Length; i++)
            {
                int val = str[i];
                charsCount[val] = charsCount[val] + 1;
                if (charsCount[val] > 1)
                {
                    return false;
                }

            }
            return true;

        }

虽然它运行良好。如何降低其空间复杂度,以便在运行时可以使用最少的内存。问候。

1 个答案:

答案 0 :(得分:0)

为了最小化空间复杂度,请使用byte[]boolcharsCount或更好BitArray,因为您只是用它来设置标记:

public static bool isUniqueCharsInString(String str)
{
    var charsCount = new BitArray(256);
    for (int i = 0; i < str.Length; i++)
    {
        int val = str[i];
        if (charsCount[val])
        {
            return false;
        }
        charsCount[val] = true;
    }
    return true;
}

使用LINQ的一种有趣的替代方法:

public static bool isUniqueCharsInString1(String str)
{
    return str.ToCharArray().GroupBy(c => c).All(g => g.Count() <= 1);
}

它在空间和时间上都不太优化,但更简洁易懂。

出于好奇:你为什么如此担心太空复杂性?您的原始实现仅使用1 KB阵列(256 * 4 B)。