以下用于在Java中查找回文的代码的时间和空间复杂度是什么:
public static boolean isPalindrome(String str) {
return str.equals(new StringBuilder(str).reverse().toString());
}
我知道reverse()是O(n)。 toString()也是O(n)。 equals也是O(n)。这是否意味着此代码为O(n)?
至于空间复杂性,需要创建一个StringBuilder。我不确定它转换成字符串后会发生什么。 Java是否为转换为字符串的StringBuilder分配空间,然后忘记StringBuilder(允许它被垃圾收集器拾取)?
谢谢!
----------编辑-------------
我想知道更多关于调用isPalindrome后在堆栈上创建的内容。与例如
相比,它在空间方面的效率如何谢谢!我仍然不太明白这段代码在空间方面的效率如何。究竟将在堆栈上创建什么?与(例如)
相比,它(在空间方面)的效率如何public boolean palindrome2(String str) {
int n = str.length();
for( int i = 0; i < n/2; i++ )
if (str.charAt(i) != str.charAt(n-i-1)) return false;
return true;
}
答案 0 :(得分:0)
假设所有这些操作都是O(n),我说你是对的:O(n)+ O(n)+ O(n)= 3 * O(n)(或O(3n),如果你愿意的话,那么就属于O(n)类别。
StringBuilder
的内容 - 您创建了一个匿名实例,并且在方法isPalindrome
结束后,没有对该对象的引用,因为它的范围仅对于此方法是本地的。所以是的,它最终将由垃圾收集器处理。很可能不会立即,但我认为这无论如何都不是你的担忧。