vlambda博客
学习文章列表

常用算法之验证回文串

    

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