将字符串转换为字母数字

时间:2018-08-17 17:36:25

标签: string go

我想找到一种将给定字符串转换为字母数字的方法,而不是像在下面的代码中那样按ascii值范围进行转换的更好方法。它可以按预期工作,但想知道是否有更干净的方法可以做到这一点。

我的函数buildAlphaN()还将字符串转换为小写形式,以进行随后的检查。

如果输入:“一个人,一个计划,一条运河:巴拿马” 然后从buildAlphaN()输出:amanaplanacanalpanama

对于上下文问题,我拥有完整的解决方案,但我的问题仅是针对buildAlphaN()函数。

// spaces part of palindrome? - ignored. 
import "strings"

//builds alphan and returns lower case
func buildAlphaN(s string) string {
    res := ""
    for _, v := range s {
         //0-9, A-Z, a-z
        if (v >= 48 && v <=57) || (v >= 65 && v <= 90) || (v >= 97 && v <= 122) {
            res += string(v)
        } 
    } 

    return strings.ToLower(res) 
}

func isPalindrome(s string) bool {
    if len(s) == 0 {
        //empty string
        return true
    } 

    s2 := buildAlphaN(s)
    fmt.Printf("s:%v s2:%v\n", s, s2)

    if palindromeCheck(s2) == true {
        return true
    }
    return false 
}

func  palindromeCheck(s string) bool {
    if len(s) == 1 {
        return true
    }

    for i, j := 0, len(s) - 1; i < j; i,j = i+1, j-1 {
        if s[i] == s[j] {
            continue
        } else {
            return false 
        } 
    }  
    return true
}

1 个答案:

答案 0 :(得分:1)

例如,

package main

import (
    "fmt"
    "unicode"
)

func isPalindrome(s string) bool {
    rs := make([]rune, 0, len(s))
    for _, r := range s {
        if unicode.IsLetter(r) || unicode.IsNumber(r) {
            rs = append(rs, unicode.ToLower(r))
        }
    }

    for i, j := 0, len(rs)-1; i < j; i, j = i+1, j-1 {
        if rs[i] != rs[j] {
            return false
        }
    }
    return true
}

func main() {
    s := "A man, a plan, a canal: Panama"
    fmt.Println(isPalindrome(s))
}

输出:

true