回文中的substring()方法

时间:2016-11-29 21:30:13

标签: java recursion palindrome

一个众所周知的递归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 ??

是否返回空字符串或其他内容?

2 个答案:

答案 0 :(得分:3)

s的值为nn时,当我们逐步执行这些语句时,会发生这种情况:

  • s.length()为2,因此第一个if条件不匹配
  • s.charAt(0)ns.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)