LeetCode – 最长回文串
- 2019 年 10 月 4 日
- 筆記
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 } }
结果:
看上去这速度还不错。
