常用算法之验证回文串
最近没有更新,一来在学习整理有深度能够吸引大家的文章,二来参与了徐大组织的 Go 官网汉化的项目,时间稍紧!
闲话少叙,今天给大家分享一道面试中经常碰到的简单算法题目 - 检测回文串。
题目:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例1:
输入: "A man, a plan, a canal: Panama"输出: true
示例2:
输入: "race a car"输出: false
思路:
利用双指针。
初始化两个指针 i、j,i从字符串左侧开始,j从字符串右侧开始,我们每次将 i + 1,将 j - 1 判断两个字符是否相等,如果两个指针能够相遇就说明是回文串,不然就不是回文串。
Go代码示例
func isPalindrome(s string) bool {// 将字符串转为小写s = strings.ToLower(s)// 定义两个初始化指针i, j := 0, len(s) - 1// 当 i >= j 时两个指针相遇说明是回文for i < j {// 非字母h或数字s时左侧指针加一继续循环if !isanum(s[i]) {i++continue}// 非字母h或数字s时右侧指针减一继续循环if !isanum(s[j]) {j--continue}// 当对称字符不想等说明不是回文if s[i] != s[j] {return false}i++j--}return true}func isanum(x byte) bool {return (x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z') || (x >= '0' && x <= '9')}
复杂度分析
时间复杂度:O(n)O(∣s∣)
空间复杂度:O(1)
