一、📘 案例目标
本案例将实现一个程序,判断用户输入的字符串是否是“回文字符串”,即:正着读和反着读都一样的字符串。
例如:
- • ✅“上海自来水来自海上”是回文
- • ✅“ABBA”是回文
- • ❌“Hello”不是回文
通过本案例,读者可以:
- • 熟练掌握字符串处理技巧
- • 学会用双指针法判断回文
- • 掌握 Unicode 字符比较的正确方法
- • 开始编写结构清晰的业务逻辑函数
二、 案例背景与应用场景
“回文字符串”常出现在编程面试题、数据结构与算法课程、文本处理程序中。实际应用包括:
- • 自然语言处理(如检测对称结构、标注)
- • 文本对称性分析
- • 前端交互逻辑(如输入检查)
- • 字符串加密/反解的规则判定
三、 案例说明
- 1. 用户在命令行输入任意一段文字;
- 2. 程序判断其是否为回文字符串;
- 3. 支持中文、英文、标点、空格;
- 4. 忽略空格、大小写和标点干扰;
- 5. 输出判断结果。
四、 涉及知识点讲解
1. 什么是回文?
回文(Palindrome)是指从左到右和从右到左读起来都一样的字符串,如“ABBA”“level”“我爱我”。
2. 字符串预处理
为了精准判断,我们需要:
- • 忽略空格
- • 忽略大小写差异
- • 移除标点符号(可选)
3. 如何比较?
使用双指针法:一头一尾向中间靠拢进行字符比较。
五、完整实现代码
📄 示例代码
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:
请输入一句话:A man a plan a canal Panama 这是一个回文字符串 ✅
示例3:
请输入一句话:Go语言真的好 这不是一个回文字符串 ❌
示例4(中文):
请输入一句话:上海自来水来自海上 这是一个回文字符串 ✅
八、常见错误示范
错误1:直接反转字符串做对比
return s == reverse(s)
这种写法没有处理空格、大小写、标点,容易误判。
错误2:使用 []byte
而非 []rune
for i, j := 0, len(s)-1; i < j; ...
如果 s
中有中文字符,会乱码或报错。建议始终使用 []rune(s)
。
九、扩展任务
- • ✔ 写一个函数,返回所有输入中的回文子串
- • ✔ 支持多语言判断(如日语、韩语等)
- • ✔ 在 Web 中实现前端页面的回文检测(使用 Go 后端 API)
🔚 小结
通过本案例你学到了:
- • 如何标准化字符串进行比较
- • 如何正确处理 Unicode 字符串
- • 如何使用双指针法判断逻辑
- • 如何封装通用业务逻辑函数
回文判断是一个典型的逻辑题目,也常用于笔试和基础项目中,掌握这一方法也为你打下算法与数据结构学习的基础。