Go语言实战案例-判断回文字符串-是不是正着念反着念都一样?

一、案例目标

本案例将实现一个程序,判断用户输入的字符串是否是"回文字符串",即:正着读和反着读都一样的字符串。

例如:

  • • ✅"上海自来水来自海上"是回文
  • • ✅"ABBA"是回文
  • • ❌"Hello"不是回文

通过本案例,读者可以:

  • • 熟练掌握字符串处理技巧
  • • 学会用双指针法判断回文
  • • 掌握 Unicode 字符比较的正确方法
  • • 开始编写结构清晰的业务逻辑函数

二、 案例背景与应用场景

"回文字符串"常出现在编程面试题、数据结构与算法课程、文本处理程序中。实际应用包括:

  • • 自然语言处理(如检测对称结构、标注)
  • • 文本对称性分析
  • • 前端交互逻辑(如输入检查)
  • • 字符串加密/反解的规则判定

三、 案例说明

    1. 用户在命令行输入任意一段文字;
    1. 程序判断其是否为回文字符串;
    1. 支持中文、英文、标点、空格;
    1. 忽略空格、大小写和标点干扰;
    1. 输出判断结果。

四、涉及知识点讲解

1. 什么是回文?

回文(Palindrome)是指从左到右和从右到左读起来都一样的字符串,如"ABBA""level""我爱我"。

2. 字符串预处理

为了精准判断,我们需要:

  • • 忽略空格
  • • 忽略大小写差异
  • • 移除标点符号(可选)

3. 如何比较?

使用双指针法:一头一尾向中间靠拢进行字符比较。


五、 完整实现代码

📄 示例代码

go 复制代码
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
    "unicode"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("请输入一句话:")
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input)

    if isPalindrome(input) {
        fmt.Println("这是一个回文字符串 ✅")
    } else {
        fmt.Println("这不是一个回文字符串 ❌")
    }
}

// 判断是否为回文字符串
func isPalindrome(s string) bool {
    // 预处理:移除空格、标点,统一小写
    var filtered []rune
    for _, r := range []rune(s) {
        if unicode.IsLetter(r) || unicode.IsDigit(r) {
            filtered = append(filtered, unicode.ToLower(r))
        }
    }

    // 双指针判断
    for i, j := 0, len(filtered)-1; i < j; i, j = i+1, j-1 {
        if filtered[i] != filtered[j] {
            return false
        }
    }
    return true
}

六、 代码解析

关键部分 说明
unicode.IsLetter/IsDigit 过滤掉标点、空格等非字符内容
unicode.ToLower(r) 忽略大小写差异
双指针法 i, j 分别从头尾向中间比较字符是否一致
使用 rune 切片 确保支持多字节中文字符,不乱码

七、🧪 示例运行

示例1:

复制代码
请输入一句话:ABBA
这是一个回文字符串 ✅

示例2:

css 复制代码
请输入一句话:A man a plan a canal Panama
这是一个回文字符串 ✅

示例3:

复制代码
请输入一句话:Go语言真的好
这不是一个回文字符串 ❌

示例4(中文):

复制代码
请输入一句话:上海自来水来自海上
这是一个回文字符串 ✅

八、 常见错误示范

错误1:直接反转字符串做对比

ini 复制代码
return s == reverse(s)

这种写法没有处理空格、大小写、标点,容易误判。

错误2:使用 []byte 而非 []rune

css 复制代码
for i, j := 0, len(s)-1; i < j; ...

如果 s 中有中文字符,会乱码或报错。建议始终使用 []rune(s)


九、 扩展任务

  • • ✔ 写一个函数,返回所有输入中的回文子串
  • • ✔ 支持多语言判断(如日语、韩语等)
  • • ✔ 在 Web 中实现前端页面的回文检测(使用 Go 后端 API)

🔚 小结

通过本案例你学到了:

  • • 如何标准化字符串进行比较
  • • 如何正确处理 Unicode 字符串
  • • 如何使用双指针法判断逻辑
  • • 如何封装通用业务逻辑函数

回文判断是一个典型的逻辑题目,也常用于笔试和基础项目中,掌握这一方法也为你打下算法与数据结构学习的基础。

相关推荐
南囝coding几秒前
做付费社群,强烈建议大家做这件事!
前端·后端
Cache技术分享18 分钟前
131. Java 泛型 - 目标类型与泛型推断
前端·后端
Codebee1 小时前
OneCode 3.0 VFS客户端驱动(SDK)技术解析:从架构到实战
java·后端·架构
喜欢敲代码的程序员2 小时前
Spring Boot中请求参数读取方式
java·spring boot·后端·spring
中烟创新2 小时前
DeepSeek部署实战:模型对比、部署优化与应用场景解析
前端·后端
亚洲第一中锋_哈达迪3 小时前
详解缓存淘汰策略:LFU
后端·缓存·golang
灰小猿3 小时前
多级@JsonTypeInfo和@JsonSubTypes注解使用详解及场景分析
java·后端·mysql·spring·spring cloud
子林super3 小时前
PostgreSQL主从切换后时间线修复操作手册
后端
程序员鱼皮3 小时前
Stack Overflow,彻底凉了!
前端·后端·计算机·程序员·互联网