[面试常问总结] 4. 验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:

 

 示例 2:

 

思路1:

1、首先将字符串s转换为小写,然后定义一个列表,其中只保存字母和数字。
2、判断 反转后的列表是否和原列表相等

 

//判断是否是回文字符串,通过反转字符串方式,例如:IsPalindrome1("hEle,h") 返回true
func IsPalindrome1(str string) bool {
    //全部转成小写
    str = strings.ToLower(str)
    strByte := []rune(str)
    var newStrByte []rune
    //去除标点符合
    for _, l := range strByte {
        if unicode.IsPunct(l) {
            continue
        }
        newStrByte = append(newStrByte, l)
    }
    //反转字符串后,看看是否原字符串一致
    if ReverseString(string(newStrByte)) == string(newStrByte) {
        return true
    }
    return false
}
//反转字符串
//双指针法 例如:ReverseString("hello") 返回olleh ;ReverseString("helo") 返回oleh
func ReverseString(str string) string {
    strByte := []rune(str)
    num := len(strByte)
    if num == 0 {
        return ""
    }
    //双指针
    //找到中间位置
    mid := num / 2
    //最后一个元素
    j := num - 1
    //循环到中间位置
    for i := 0; i < mid; i++ {
        //多重赋值,左右两边元素交换
        strByte[i], strByte[j] = strByte[j], strByte[i]
        //右边指针往左移动
        j--
    }
    return string(strByte)
}

思路2:

通过左右指针法 , 左边和右边进行相等比较 , 当前去除掉标点符号

//判断是否是回文字符串
//双指针法 通过左右指针,例如:IsPalindrome2("hEle,h") 返回true
func IsPalindrome2(str string) bool {
    //全部转成小写
    str = strings.ToLower(str)
    strByte := []rune(str)
    //定义左右指针
    left := 0
    right := len(strByte) - 1
    for left < right {
        //跳过标点
        if unicode.IsPunct(strByte[left]) {
            left++
        }
        if unicode.IsPunct(strByte[right]) {
            right--
        }
        if strByte[left] != strByte[right] {
            return false
        }
        left++
        right--
    }
    return true
}

 

posted @ 2021-05-18 14:39  唯一客服系统开发笔记  阅读(80)  评论(0)    收藏  举报