常用算法之验证回文串

今天给大家分享一道面试中经常碰到的简单算法题目 - 检测回文串。

题目:

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

示例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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值