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 字符串
  • • 如何使用双指针法判断逻辑
  • • 如何封装通用业务逻辑函数

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

相关推荐
ltl30 分钟前
Transformer 原论文怎么训出来的:8 张 P100、12 小时、warmup 4000 步
后端
why技术33 分钟前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
程序猿追2 小时前
我搭了个网页工具:输入关键词,SERP API 自动吐出比价 Excel
后端
Lee川2 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端
Lee川2 小时前
MCP 高德地图实战:当 AI 学会使用工具,一个协议如何重塑大模型的行动边界
前端·人工智能·后端
楼田莉子2 小时前
C++17新特性:__had_include/属性/求值顺序规则
开发语言·c++·后端
程序员cxuan2 小时前
Codex 把我家烂网给优化后,我 TM 直接原地起飞了。
人工智能·后端·程序员
IT_陈寒2 小时前
Redis批量删除踩了坑,原来DEL命令不是万能的
前端·人工智能·后端
叫我少年3 小时前
C# 命名空间与 using 指令 — 文件范围、全局导入、别名
后端
我是一颗柠檬5 小时前
【MySQL全面教学】MySQL基础SQL语句Day3(2026年)
数据库·后端·sql·mysql·oracle