递归算法的空间复杂度

时间:2015-03-11 22:27:41

标签: java algorithm recursion space-complexity

我有一个递归算法来在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中做了什么?

1 个答案:

答案 0 :(得分:2)

在旧版本的Java(mainly in Java 6 and before)*中,substring返回了一个新实例,该实例共享了较长字符串的内部char数组(很好地说明了here )。然后substring有时间和空间复杂度 O(1)

较新的版本使用String的不同表示形式,它不依赖于共享数组。相反,substring分配一个只需要大小的新数组,并从较长的字符串中复制内容。然后substring的时间和空间复杂度为 O(n)

*实际上,更改是在Java 7的更新6中引入的。