我想找到一种将给定字符串转换为字母数字的方法,而不是像在下面的代码中那样按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
}
答案 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