一个众所周知的递归isPalindrome
方法
public static boolean isPalindrome(String s){
if(s.length() == 0 || s.length() == 1)
return true;
if(s.charAt(0) == s.charAt(s.length()-1))
return isPalindrome(s.substring(1, s.length()-1));
return false;
}
}
有一行我不太明白。例如,如果我们将字符串anna
传递给isPalindrome method
,那么这行代码是什么
return isPalindrome(s.substring(1, s.length()-1));
当s
的值为nn
时,对字符串执行操作?
在我的理解中,数字1(索引1
)用于第二个字母n
,而s.length()-1
等于2-1 = 1
,但不包括该索引位置,因此必须是索引0
??
是否返回空字符串或其他内容?
答案 0 :(得分:3)
当s
的值为nn
时,当我们逐步执行这些语句时,会发生这种情况:
s.length()
为2,因此第一个if
条件不匹配s.charAt(0)
为n
,s.charAt(1)
为n
,因此第二个if
匹配isPalindrome
返回s.substring(1, 1)
的结果,这是从位置1到位置1之前的文本范围,换句话说,是一个空字符串isPalindrome
将匹配长度上的第一个条件,return true
为了记录,这是检查Java中回文的一种非常低效的方法,
因为substring
创建了新的字符串,这很慢。
通过添加开始和结束索引参数并向内移动它们,直到它们的差异变为0或1,可以实现更有效的递归解决方案。
答案 1 :(得分:0)
return isPalindrome(s.substring(1, s.length() - 1));
将"循环"通过发送没有第一个和最后一个字符的字符串值 - 或者从第二个字符到最后一个字符(a.k.a.倒数第二个)发送字符串值。然后它将再次比较该字符串;那么它将会循环播放#34;再次使用相同的例程。
我认为你的困惑"可能在于s.length()
将返回s
有多少个字符(从1
自然计算。N
);但是s.substring(...)
适用于索引,它们以0
开头(不是1
)。在那个" fashion"中,最后一个字符将是长度减去一个。
示例:
String example = "Five"; // ["F", "i", "v", "e"]
// 0 1 2 3 <--- indexes
// Length is four (it has 4 characters)