我写了以下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;
}
虽然它运行良好。如何降低其空间复杂度,以便在运行时可以使用最少的内存。问候。
答案 0 :(得分:0)
为了最小化空间复杂度,请使用byte[]
或bool
来charsCount
或更好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)。