介绍
在本实验中,我们将学习如何在 Java 中检查一个字符串是否是回文。回文是指正读和反读都相同的字符串。
在本实验中,我们将学习如何在 Java 中检查一个字符串是否是回文。回文是指正读和反读都相同的字符串。
我们将实现的第一个方法是双指针法。我们将创建一个名为 isPalindrome
的方法,该方法接收一个字符串作为输入,并返回一个布尔值,指示该字符串是否是回文。
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
int start = 0;
int end = str.length() - 1;
while (start < end) {
char startChar = Character.toLowerCase(str.charAt(start));
char endChar = Character.toLowerCase(str.charAt(end));
if (startChar != endChar) {
return false;
}
start++;
end--;
}
return true;
}
}
isPalindrome
方法使用了两个指针 start
和 end
,它们分别从字符串的开头和末尾开始。循环会一直运行,直到两个指针在中间相遇。
在每次迭代中,我们比较 start
和 end
指针处的字符。如果它们不相等,我们返回 false
。如果相等,我们更新指针以检查字符串中的下一组字符。
为了测试我们的方法,我们可以添加一个 main
方法,并使用不同的输入字符串调用 isPalindrome
方法。
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
// Implementation of isPalindrome method
}
public static void main(String[] args) {
System.out.println("Is 'racecar' a palindrome? " + isPalindrome("racecar"));
System.out.println("Is 'hello' a palindrome? " + isPalindrome("hello"));
}
}
接下来我们将实现的方法是递归法。我们将创建一个名为 isPalindromeRecursive
的新方法,该方法接收字符串、起始索引和结束索引作为输入。
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
String lowercaseStr = str.toLowerCase();
return isPalindromeRecursive(lowercaseStr, 0, lowercaseStr.length() - 1);
}
public static boolean isPalindromeRecursive(String str, int start, int end) {
if(start >= end) {
return true;
}
char startChar = Character.toLowerCase(str.charAt(start));
char endChar = Character.toLowerCase(str.charAt(end));
if(startChar != endChar) {
return false;
}
return isPalindromeRecursive(str, start + 1, end - 1);
}
public static void main(String[] args) {
// Tests for isPalindrome and isPalindromeRecursive methods
}
}
isPalindromeRecursive
方法使用递归来检查字符串是否是回文。我们有两个基本情况:
start
索引大于或等于 end
索引,这意味着我们已经检查了字符串中的所有字符并且它们匹配,因此我们返回 true
。start
和 end
索引处的字符不相等,我们返回 false
。如果以上两种情况都不满足,我们使用更新后的索引再次调用 isPalindromeRecursive
方法。
现在,我们可以在 main
方法中调用递归方法来测试它。
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
// Implementation of isPalindrome method
}
public static boolean isPalindromeRecursive(String str, int start, int end) {
// Implementation of isPalindromeRecursive method
}
public static void main(String[] args) {
System.out.println("Is 'racecar' a palindrome? " + isPalindromeRecursive("racecar", 0, 6));
System.out.println("Is 'hello' a palindrome? " + isPalindromeRecursive("hello", 0, 4));
}
}
我们将实现的最后一个方法是字符串反转法。我们将创建一个名为 isPalindromeReverse
的新方法,该方法接收一个字符串作为输入。
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
// Implementation of isPalindrome method
}
public static boolean isPalindromeRecursive(String str, int start, int end) {
// Implementation of isPalindromeRecursive method
}
public static boolean isPalindromeReverse(String str) {
String reversed = "";
for (int i = str.length() - 1; i >= 0; i--) {
reversed += str.charAt(i);
}
return str.equalsIgnoreCase(reversed);
}
public static void main(String[] args) {
// Tests for isPalindrome and isPalindromeRecursive methods
System.out.println("Is 'racecar' a palindrome? " + isPalindromeReverse("racecar"));
System.out.println("Is 'hello' a palindrome? " + isPalindromeReverse("hello"));
}
}
isPalindromeReverse
方法创建了一个名为 reversed
的新字符串,并通过从输入字符串的末尾到开头进行迭代来填充它。如果两个字符串在忽略大小写的情况下相等,则返回 true
。
我们可以在 main
方法中添加对 isPalindromeReverse
的调用来测试该方法。
最后,我们将使用 Java Streams API 来检查回文。我们将创建一个名为 isPalindromeStream
的新方法,该方法接收一个字符串作为输入。
import java.util.stream.IntStream;
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
// Implementation of isPalindrome method
}
public static boolean isPalindromeRecursive(String str, int start, int end) {
// Implementation of isPalindromeRecursive method
}
public static boolean isPalindromeReverse(String str) {
// Implementation of isPalindromeReverse method
}
public static boolean isPalindromeStream(String str) {
String lowercaseStr = str.toLowerCase();
return IntStream.range(0, lowercaseStr.length() / 2)
.noneMatch(i -> lowercaseStr.charAt(i) != lowercaseStr.charAt(lowercaseStr.length() - i - 1));
}
public static void main(String[] args) {
// Tests for isPalindrome and isPalindromeRecursive methods
System.out.println("Is 'racecar' a palindrome? " + isPalindromeStream("racecar"));
System.out.println("Is 'hello' a palindrome? " + isPalindromeStream("hello"));
}
}
isPalindromeStream
方法使用 IntStream
类生成一系列索引,我们可以使用这些索引来比较字符串中的字符。
我们使用 noneMatch
方法,如果没有任何字符违反 ith
和 n-i-1th
字符相等的条件(其中 n
是字符串的长度,i
是索引),则返回 true
。
我们可以在 main
方法中添加对 isPalindromeStream
的调用来测试该方法。
在本实验中,我们学习了如何在 Java 中检查给定字符串是否是回文。我们实现了四种不同的方法来完成此任务:
现在你已经理解了这些方法,可以使用它们来解决更复杂的问题!