===问:

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

示例 1:

输入: “A man, a plan, a canal: Panama”
输出: true

示例 2:

输入: “race a car”
输出: false

===答:

方法一:
执行用时 :500 ms, 击败了5.29% 的用户
内存消耗 :7.6 MB, 击败了25.00%的用户

abab
func isPalindrome1(s string) bool {
	l := len(s) - 1
	if l < 1 {
		return true
	}

	s = strings.ToLower(s)
	a := ""
	b := ""

	for i := l; i >= 0; i-- {
		if (s[i] >= 48 && s[i] <= 57) || (s[i] >= 97 && s[i] <= 122) {
			a += string(s[i])
		}

		if (s[l-i] >= 48 && s[l-i] <= 57) || (s[l-i] >= 97 && s[l-i] <= 122) {
			b += string(s[l-i])
		}
	}

	if a == b {
		return true
	}

	return false
}

方法二:
执行用时 :248 ms, 击败了5.29% 的用户
内存消耗 :8.3 MB, 击败了16.67%的用户

asafalse
func isPalindrome2(s string) bool {
	l := len(s) - 1
	if l < 1 {
		return true
	}

	s = strings.ToLower(s)
	a := ""

	for i := l; i >= 0; i-- {
		if (s[i] >= 48 && s[i] <= 57) || (s[i] >= 97 && s[i] <= 122) {
			a += string(s[i])
		}
	}

	j := 0
	for i := range s {
		if (s[i] >= 48 && s[i] <= 57) || (s[i] >= 97 && s[i] <= 122) {
			if a[j] != s[i] {
				fmt.Println(a, s, string(a[j]), string(s[i]))
				return false
			}
			j++
		}
	}

	return true
}

方法三:
执行用时 :40 ms, 击败了10.10% 的用户
内存消耗 :8.5 MB, 击败了16.67%的用户

ttfalse
func isPalindrome3(s string) bool {
	if len(s) < 2 {
		return true
	}

	s = strings.ToLower(s)
	re := regexp.MustCompile("\\w")
	t := re.FindAll([]byte(s), -1)
	l := len(t)

	for i := 0; i < l/2; i++ {
		if t[i][0] != t[l-1-i][0] {
			return false
		}
	}

	return true
}

方法四:
执行用时 :32 ms/24 ms, 击败了10.74%/12.98% 的用户
内存消耗 :7.5 MB, 击败了25.00%的用户

方法三的基础上进一步简化,去掉了不必要的变量
本方法内存占用比方法三降低,执行效率比方法三提升一倍

func isPalindrome4(s string) bool {
	t := regexp.MustCompile("\\w").FindAllString(strings.ToLower(s), -1)

	for i := 0; i < len(t)/2; i++ {
		if t[i] != t[len(t)-1-i] {
			return false
		}
	}

	return true
}

方法五:
执行用时 :0 ms/4 ms, 击败了100.00%/68.11% 的用户
内存消耗 :2.7 MB, 击败了91.67%/75.00% 的用户

ijij1false
func isPalindrome5(s string) bool {
	if len(s) < 2 {
		return true
	}

	i, j := 0, len(s)-1

	for i < j {

		if !unicode.IsDigit(rune(s[i])) && !unicode.IsLetter(rune(s[i])) {
			i++
			continue
		}

		if !unicode.IsDigit(rune(s[j])) && !unicode.IsLetter(rune(s[j])) {
			j--
			continue
		}

		if unicode.ToLower(rune(s[i])) != unicode.ToLower(rune(s[j])) {
			return false
		}

		i++
		j--

	}

	return true
}
===解:

什么是回文串?

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

参考:《回文串》

字符串 strings.

strings.ToLower()

其余的包含、替换、拼接、分割等等方法请
参考:《golang标准库-strings》

正则 regexp.

[a-zA-Z0-9]\\w

unicode.

unicode
rune()runeint32

rune

关于几个类型的关系可以参考我之前写的日志。