回文中的 substring() 方法

substring() method in a 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 ??

它 return 是空字符串还是其他内容?

return isPalindrome(s.substring(1, s.length() - 1)); 将 "loop" 通过发送没有第一个和最后一个字符的字符串值 — 或者从第二个到倒数第二个(a.k.a. 倒数第二个) .然后它会再次比较那个字符串;然后它将使用相同的例程再次 "loop"。

我认为你的 "confusion" 可能在于 s.length() 将 return 有多少个字符 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)

s 的值为 nn 时,当我们单步执行语句时,将发生以下情况:

  • s.length()是2,所以第一个if条件不符合
  • s.charAt(0)ns.charAt(1)n,所以第二个if匹配
  • Return带参数s.substring(1, 1)isPalindrome的结果,即从位置1到位置1之前的文本范围,即空字符串
  • 在以空字符串为输入的递归调用中,isPalindrome将匹配长度上的第一个条件,而return true

郑重声明,这是检查 Java 中回文的一种非常低效的方法, 因为 substring 创建新字符串,速度很慢。 通过添加开始和结束索引参数,并将它们向内移动,直到它们的差异变为 0 或 1,可以实现更有效的递归解决方案。