【发布时间】:2015-05-13 22:45:45
【问题描述】:
我有一个递归算法来查找 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 中的实际作用是什么?
【问题讨论】:
-
Here's 源代码。自己看吧。
-
从 OpenJDK 7u6 开始,
substring创建一个全新的副本并花费 O(n) 时间;接受开始和结束索引的重载可能会更好。 -
看起来像
O(n)构造一个新字符串,除非请求的子字符串已经是完整的字符串。 -
谢谢@SotiriosDelimanolis .......看起来,它会增加时间复杂度。必须做得更好。
-
一个更简单的解决方案 - 并且可以正确处理 Unicode 代理对 - 是调用
StringBuilder#reverse()docs.oracle.com/javase/7/docs/api/java/lang/… 然后与输入字符串进行比较。
标签: java algorithm recursion space-complexity