我发现了一种算法here,该算法可以从具有O(1)空间复杂度(SC)的字符串中删除重复的字符。在这里,我们看到算法将字符串转换为非恒定的字符数组,它将根据输入大小而变化。他们声称它将在O(1)的SC中运行。怎么样?
// Function to remove duplicates
static string removeDuplicatesFromString(string string1)
{
// keeps track of visited characters
int counter = 0;
char[] str = string1.ToCharArray();
int i = 0;
int size = str.Length;
// gets character value
int x;
// keeps track of length of resultant String
int length = 0;
while (i < size) {
x = str[i] - 97;
// check if Xth bit of counter is unset
if ((counter & (1 << x)) == 0) {
str[length] = (char)('a' + x);
// mark current character as visited
counter = counter | (1 << x);
length++;
}
i++;
}
return (new string(str)).Substring(0, length);
}
看来我不了解太空复杂性。
答案 0 :(得分:3)
我在这里找到了一种算法,该算法可以从具有O(1)空间复杂度(SC)的字符串中删除重复的字符。在这里,我们看到算法将字符串转换为非恒定的字符数组,它将根据输入大小而变化。他们声称它将在O(1)的SC中运行。怎么样?
不是。
该算法将仅包含26个字符的任意大小的字符串作为输入,因此输出只能是26个字符或更少,因此输出数组不必具有输入的大小。
您正确地指出,站点上给出的实现不必要地为char数组分配了O(n)额外的空间。
锻炼:您可以解决字符数组问题吗?
Harder练习:您能否描述并实现一个字符串数据结构,该结构可以有效地实现字符串的协定,但实际上可以仅对任意字符串使用O(1)额外空间来实现该算法?
更好的练习:事实上,我们只能使用26个字符的字母,这是俗气的“让我们只将int用作标志集”解决方案。与其说n是输入字符串的大小,不如让我们允许具有相等关系的任意值的任意序列;您能否提出一个解决方案,即输出序列的大小为O(n),而不是输入序列的大小?
也就是说,您是否可以使用O(n)存储(其中n是输出序列的大小)来实现public static IEnumerable<T> Distinct<T>(this IEnumerable<T> t)
以便对输出进行重复数据删除,但是输出与输入的顺序相同?
这是一个更好的练习,因为此函数实际上是在基类库中实现的。与玩具问题不同,它很有用。
我还注意到问题陈述假设只有一个相关的字母带有小写字母,并且有26个。这个假设是错误的。