java回文字符串
时间: 2025-05-12 20:33:54 浏览: 28
### Java 中实现回文字符串检查
在 Java 编程语言中,可以通过多种方法来判断一个字符串是否为回文字符串。以下是几种常见的实现方式:
#### 方法一:通过反转字符串并比较原字符串与反转后的字符串
这种方法的核心思路是先将输入的字符串反转,再将其与原始字符串进行对比。如果两者相同,则说明该字符串是一个回文。
```java
import java.util.Scanner;
public class PalindromeChecker {
public static boolean isPalindrome(String str) {
String reversedStr = new StringBuilder(str).reverse().toString();
return str.equals(reversedStr);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String input = scanner.nextLine();
if (isPalindrome(input)) {
System.out.println("这是一个回文字符串");
} else {
System.out.println("这不是一个回文字符串");
}
}
}
```
上述代码实现了基本的功能逻辑[^1]。`StringBuilder` 的 `reverse()` 方法用于快速反转字符串。
---
#### 方法二:双指针法
此方法利用两个指针分别指向字符串的起始位置和结束位置,逐步向中间移动,并逐个字符进行匹配验证。如果在整个过程中发现不相等的情况,则可以立即判定其不是回文。
```java
public class PalindromeCheckerWithPointers {
public static boolean isPalindrome(String str) {
int left = 0;
int right = str.length() - 1;
while (left < right) {
if (str.charAt(left) != str.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
public static void main(String[] args) {
String testString = "racecar";
if (isPalindrome(testString)) {
System.out.println(testString + " 是一个回文字符串");
} else {
System.out.println(testString + " 不是一个回文字符串");
}
}
}
```
这段代码展示了如何使用双指针技术高效地检测回文特性[^3]。
---
#### 方法三:Manacher’s Algorithm(马拉车算法)
对于更复杂的场景,比如统计给定字符串内的所有可能子串中有多少个是回文的情况下,可以采用 Manacher’s Algorithm 来优化性能。这种高级算法能够在 O(n) 时间复杂度下完成任务。
下面展示了一个基于中心扩展技巧简化版的例子,它可以用来计数所有的回文子串数量:
```java
class CountPalindromicSubstrings {
private int resultCount = 0;
public int countSubstrings(String s) {
if (s == null || s.isEmpty()) {
return 0;
}
for (int i = 0; i < s.length(); ++i) {
extendPalindrome(s, i, i); // 奇数长度回文
extendPalindrome(s, i, i + 1); // 偶数长度回文
}
return resultCount;
}
private void extendPalindrome(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
--left;
++right;
++resultCount;
}
}
public static void main(String[] args) {
CountPalindromicSubstrings cps = new CountPalindromicSubstrings();
System.out.println(cps.countSubstrings("abc")); // 输出: 3 ("a", "b", "c")
System.out.println(cps.countSubstrings("aaa")); // 输出: 6 ("a", "a", "a", "aa", "aa", "aaa")
}
}
```
这里提供了完整的源码示例[^4],其中心思想是从每一个潜在的中心出发尝试构建尽可能大的回文区域直到无法继续为止。
---
### 总结
以上介绍了三种不同的策略——简单翻转、双向遍历以及高效的马拉开算法——它们各自适用于不同类型的回文问题解决方案,在实际开发当中可以根据具体需求选取最合适的那一种加以应用。
阅读全文
相关推荐


















