一、案例目标
本案例将实现一个程序,判断用户输入的字符串是否是"回文字符串",即:正着读和反着读都一样的字符串。
例如:
- • ✅"上海自来水来自海上"是回文
- • ✅"ABBA"是回文
- • ❌"Hello"不是回文
通过本案例,读者可以:
- • 熟练掌握字符串处理技巧
- • 学会用双指针法判断回文
- • 掌握 Unicode 字符比较的正确方法
- • 开始编写结构清晰的业务逻辑函数
二、 案例背景与应用场景
"回文字符串"常出现在编程面试题、数据结构与算法课程、文本处理程序中。实际应用包括:
- • 自然语言处理(如检测对称结构、标注)
- • 文本对称性分析
- • 前端交互逻辑(如输入检查)
- • 字符串加密/反解的规则判定
三、 案例说明
-
- 用户在命令行输入任意一段文字;
-
- 程序判断其是否为回文字符串;
-
- 支持中文、英文、标点、空格;
-
- 忽略空格、大小写和标点干扰;
-
- 输出判断结果。
四、涉及知识点讲解
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 字符串
- • 如何使用双指针法判断逻辑
- • 如何封装通用业务逻辑函数
回文判断是一个典型的逻辑题目,也常用于笔试和基础项目中,掌握这一方法也为你打下算法与数据结构学习的基础。