LeetCode第409题,难度简单。才发现两年前还用golang刷过几题,然而现在语法都忘完了。
原题地址:https://leetcode-cn.com/problems/longest-palindrome/
题目描述:
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
如果是要构造一个回文字符串,那么这个回文字符串中的字母肯定有两种情况:1. 所有字母的个数都是偶数;2. 大部分字母的个数都是偶数,只有一个字母的个数是奇数。
所以给定的字符串,我们先统计每个字符的个数,然后再判断偶数的个数(n & 1 = 1 则该数为奇数,否则为偶数)。最后,如果存在奇数,根据奇数的个数,由字符串长度减去奇数的个数再加1就是结果;如果没有奇数,直接返回。
中文官网题解:
https://leetcode-cn.com/problems/longest-palindrome/solution/
个人题解:
func longestPalindrome(s string) int {
var count ['z' - 'A' + 1]int
for _, c := range s {
count[c-'A']++
}
odd := 0
for c := 'A'; c <= 'z'; c++ {
odd += (count[c-'A'] & 1)
}
if odd> 0 {
return len(s) - odd + 1
} else {
return len(s) - odd
}
}
结果:
看上去这速度还不错。