题目
实现一个方法判断字符串是否为回文
信息
- 类型:问答
- 难度:⭐
考点
字符串处理, 方法定义, 条件判断
快速回答
实现步骤:
- 使用
gsub和正则表达式移除非字母数字字符 - 通过
downcase统一转换为小写 - 使用
reverse反转字符串后与原字符串比较 - 返回布尔值结果
原理说明
回文字符串指正序和倒序读都相同的字符串(忽略大小写和非字母数字字符)。核心处理流程:
1. 标准化字符串:移除非字母数字字符并统一大小写
2. 比较反转:检查处理后的字符串与其反转是否相同
代码示例
def palindrome?(str)
# 移除非字母数字字符并转小写
cleaned = str.gsub(/[^a-zA-Z0-9]/, '').downcase
# 比较反转结果
cleaned == cleaned.reverse
end
# 测试用例
puts palindrome?("A man, a plan, a canal: Panama") # true
puts palindrome?("Ruby") # false最佳实践
- 链式调用:合理使用
gsub.downcase链式操作保持代码简洁 - 正则优化:
/[^a-zA-Z0-9]/匹配非字母数字字符,^表示取反 - 边界处理:空字符串应返回
true(空字符串反转后仍为空)
常见错误
| 错误示例 | 问题分析 | 修正方案 |
|---|---|---|
str.reverse == str | 未处理大小写和特殊字符 | 先标准化字符串 |
gsub(' ', '') | 只能移除空格,无法处理其他字符 | 使用正则表达式匹配 |
扩展知识
- 性能优化:对于超长字符串,可使用双指针算法避免创建反转副本(时间复杂度 O(n))
- Unicode 支持:处理多语言文本时需用
\p{Alnum}替代a-zA-Z0-9 - API 参考:
String#reverse时间复杂度 O(n),gsub会创建新字符串对象