常用算法之验证回文串
最近没有更新,一来在学习整理有深度能够吸引大家的文章,二来参与了徐大组织的 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)