C# 4.0 如何降低“的空间复杂度”;isUniqueString";

C# 4.0 如何降低“的空间复杂度”;isUniqueString";,c#-4.0,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;

我已经写了以下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;

        }
公共静态bool isUniqueCharsInString(String str)
{
int[]charscont=新int[256];
for(int i=0;i1)
{
返回false;
}
}
返回true;
}

虽然它工作得很好,但我如何降低它的空间复杂度,以便在运行时使用最少的内存呢。关于。

为了最小化空间复杂度,请将
字节[]
bool
用于
charscont
或更好的
位数组,因为您仅将其用于设置标志:

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;
}
公共静态bool isUniqueCharsInString(String str)
{
var charscont=新的位数组(256);
对于(int i=0;i
使用LINQ的一种有趣的替代方法:

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

return str.ToCharArray().GroupBy(c=>c).All(g=>g.Count())您确实意识到此代码不适用于(扩展)之外的字符ASCII范围?这只是实际中的一个例子,我正在处理一个非常大的字符串,你的代码对我来说很难理解,如果你将来有时间,请详细说明一下。Thanx@user3266922第二个可能是?它首先将字符串转换为
IEnumerable
,以便能够使用LINQ,然后I GROUPp按单个字符值计算集合,在最后一步中,我计算每个不同字符的出现次数,当一个字符出现多次时,返回false。@user3266922原始algristhm的空间复杂度不取决于输入字符串的大小。同时,时间复杂度为O(n),它会在找到第一个重复字符后立即停止。考虑一下:对于长度超过256个字符的字符串,您可以立即返回false,因为只有那么多不同的字符可用。所有这些都使它比我的替代解决方案更有效。请您给我提供一个可以学习IEnumer的链接或教程能行。它真的让我很恼火,因为它被很多人使用,而且很容易,但我无法通过反复尝试来学习它的用法again@user3266922尝试搜索
LINQ教程
,然后选择。我觉得很不错。