我在O(n)时间和空间复杂度中实现了panagram程序。我希望我的程序具有O(n)时间复杂度和O(1)空间复杂度。
我的步骤是:
是否有任何优化的方法可以将空间复杂度降低到O(1)?
答案 0 :(得分:1)
据我了解你要检查,如果你是字符串是panagram。
如果你避免从字符串创建字符数组并从原始字符串迭代字符,你的复杂性将是O(N * logA)时间和O(A)空间,其中A - 字母大小。在你的情况下,A是常量,所以只有在重写程序时避免使用字符串中的创建字符数组,才能有O(N)时间和O(1)空间。
P.S。不要使用树来存储字符,最好使用大小为A的数组来存储字符串中存在的字符数。即使您可以使用大小为A或字节数为A / 8的位数组来存储特定字符是否以字符串形式呈现。此实现中的时间复杂度将是O(N)而不是O(N * logA),但它在复杂度估计中并不重要,因为A是常量,但即使如此,普通数组实现也会更快(比在树中存储字符要快几倍。
答案 1 :(得分:0)
这里我修改了程序,使用位向量为书中Cracking the coding interview
的字符串程序中找到重复的字符。
时间复杂度O(n) 空间复杂度O(1)
String str = "abcdefghijklmnopqrstuvwxyz";
int checker = 0;
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
checker |= (1 << val);
}
if (checker == 67108863)// 67108863 == 0b11111111111111111111111111
System.out.println("Panagram");
else
System.out.println("Not Panagram");
答案 2 :(得分:0)
您可以用一位代表一个角色。
'a' -> 2^0 = 1
'b' -> 2^1 = 2
'c' -> 2^3 = 4
....
'z' -> 2^25
然后26个字符由26位表示。
static int ALL = (1 << 26) - 1;
public static boolean isPanagram(String s) {
int aggregate = 0;
for (int i = 0, size = s.length(); i < size; ++i) {
char c = Character.toLowerCase(s.charAt(i));
if (c >= 'a' && c <= 'z')
aggregate |= 1 << (c - 'a');
}
return aggregate == ALL;
}