Java实现带空格字符串回文检测的代码问题求助
Java带空格字符串回文检测解决方案
问题根源
现有代码直接将包含空格的完整字符串进行反转和全等比对,空格会作为普通字符参与判定,导致nurses run、a b a这类带空格的回文短语被误判为非回文。
实现思路
不需要对原始输入的空格做删除再还原操作,只需要拆分判定和输出的数据源即可:
- 保留完整的原始输入字符串,用于最终输出,天然保留所有空格格式
- 额外生成一份移除所有空格的纯文本字符串,仅用于回文判定
修改后完整代码
import java.util.Scanner; public class LabProgram { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); String original = scnr.nextLine(); // 生成移除所有空格的纯文本,仅用于回文判定 String cleanStr = original.replace(" ", ""); String reverseClean = ""; int length = cleanStr.length(); for (int i = length - 1; i >= 0; i--){ reverseClean = reverseClean + cleanStr.charAt(i); } if (cleanStr.equals(reverseClean)){ System.out.println("palindrome: " + original); } else{ System.out.println("not a palindrome: " + original); } } }
优化建议(可选)
如果需要同时忽略大小写、提升长字符串判定效率,可以改用双指针方案,不需要生成额外的反转字符串:
import java.util.Scanner; public class LabProgram { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); String original = scnr.nextLine(); // 加toLowerCase实现忽略大小写判定 String cleanStr = original.replace(" ", "").toLowerCase(); boolean isPalindrome = true; int left = 0; int right = cleanStr.length() - 1; while (left < right) { if (cleanStr.charAt(left) != cleanStr.charAt(right)) { isPalindrome = false; break; } left++; right--; } if (isPalindrome){ System.out.println("palindrome: " + original); } else{ System.out.println("not a palindrome: " + original); } } }
补充说明
如果需要忽略的不止普通空格,还包括制表符、换行符等所有空白字符,可以把replace(" ", "")替换为replaceAll("\\s+", "")即可。
内容的提问来源于stack exchange,提问作者FireStar629
相关产品推荐
相关产品推荐

