Java程序无法识别句子回文:如何比较原输入与反转输入?
解决句子回文识别问题
我看了你的代码,问题核心出在你没有忽略句子里的空格、标点这类非字母字符。当前程序直接反转整个输入字符串(包括空格、标点),但真正的句子回文是只看字母内容的——比如“Madam, I'm Adam”这种句子,去掉标点和空格后是madamimadam,反转后和原处理后的字符串完全一致,但你的程序会把标点、空格也一起反转,导致和原句不匹配,自然判定不是回文。
而且你之前把original.equals(reverse)改成reverse.equals(original)是没用的,因为equals方法是对称的,这两种写法逻辑完全等价,根本解决不了核心问题。
具体修改方案
1. 先对输入字符串做预处理
遍历字符串,只保留其中的字母字符(你已经把输入转成小写了,不用再处理大小写问题),生成一个纯字母的新字符串。
2. 基于预处理后的字符串做回文判断
反转这个纯字母的字符串,再和预处理后的原字符串比较是否相等。
修改后的完整代码
import java.util.Scanner; public class WordPlay { public static void main(String [] args) { // Variable declarations String original, processedOriginal = "", reverse = ""; boolean lipE = true; boolean lipS = true; boolean palindrome = true; boolean alliteration = true; // Scanner object Scanner input = new Scanner(System.in); System.out.print("Please enter a sentence: "); original = input.nextLine(); original = original.toLowerCase(); System.out.println("The input that you entered was: " + original); // 预处理:提取所有字母字符,忽略空格、标点等非字母内容 for (int i = 0; i < original.length(); i++) { char c = original.charAt(i); if (Character.isLetter(c)) { processedOriginal += c; } } // Determine whether a input is a lipogram for letter E for(int i = 0; i < original.length(); i++) if(original.charAt(i) == 'e' || original.charAt(i) == 'E' ) lipE = false; if(lipE) { System.out.println("The input is a lipogram. "); } else { System.out.println("The input is not a lipogram avoiding the letter E."); } // Determine whether a input is a lipogram for letter S for(int i = 0; i < original.length(); i++) if(original.charAt(i) == 's' || original.charAt(i) == 'S' ) lipS = false; if(lipS) { System.out.println("The input is a lipogram. "); } else { System.out.println("The input is not a lipogram avoiding the letter S."); } // Determine whether or not an input is a palindrome. // 反转预处理后的纯字母字符串 for (int i = processedOriginal.length() - 1; i >= 0; i--) reverse = reverse + processedOriginal.charAt(i); if (processedOriginal.equals(reverse)) System.out.println("The input is a palindrome."); else System.out.println("The input isn't a palindrome."); } }
现在测试像“Madam, I'm Adam”这类句子,程序会正确识别为回文了。
内容的提问来源于stack exchange,提问作者Andrew_Bauer
相关产品推荐
相关产品推荐

