我有一个递归算法来在Java中找到回文。如果给定的字符串是回文,它应该返回true。否则就错了。这种方法使用子串方法,这有点难以找到复杂性。
这是我的算法:
static boolean isPalindrome (String str) {
if (str.length() > 1) {
if (str.charAt(0) == (str.charAt(str.length() - 1))) {
if (str.length() == 2) return true;
return isPalindrome(str.substring(1, str.length() - 1));
}
return false;
}
else {
return true;
}
}
此算法的空间复杂度是多少?
我的意思是,当我调用方法substring()
时,它是否一直创建一个新字符串?实际上substring
方法在Java中做了什么?
答案 0 :(得分:2)
在旧版本的Java(mainly in Java 6 and before)*中,substring
返回了一个新实例,该实例共享了较长字符串的内部char
数组(很好地说明了here )。然后substring
有时间和空间复杂度 O(1)。
较新的版本使用String
的不同表示形式,它不依赖于共享数组。相反,substring
分配一个只需要大小的新数组,并从较长的字符串中复制内容。然后substring
的时间和空间复杂度为 O(n)。
*实际上,更改是在Java 7的更新6中引入的。