You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:20:42