马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
给定一个包罗大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。
在构造过程中,请留意 区分巨细写 。比如 "Aa" 不能当做一个回笔墨符串。
示例 1:- <strong>输入:</strong>s = "abccccdd"
- <strong>输出:</strong>7
- <strong>解释:</strong>
- 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
复制代码 示例 2:- <strong>输入:</strong>s = "a"
- <strong>输出:</strong>1
- <strong>解释:</strong>可以构造的最长回文串是"a",它的长度是 1。
复制代码 提示:
- 1 <= s.length <= 2000
- s 只由小写 和/或 大写英笔墨母构成
答案:- class Solution {
- public:
- int longestPalindrome(string s)
- {
- // 回文串,如果有奇数个字符,则中间有一个字符,因为俩边对称,除了中间,其他字符都为偶数个;若有偶数个字符,则所有字符都是偶数个
- // 所以统计每个字符的数量。若该字符个数为偶数,则全部有用; 若为奇数个, 则可以取其中一个作为回文串中间的字符,其余偶数个都需要。
- // 注意:中间的一个加了就不能重复添加了。然后再遇到奇数个的字符,去掉1个后全部都加上
- // 这里用一个数组,用于统计字符个数
- vector<int> vec(58, 0); // Z和a相差7,再加上52个字母,58个位置够了, 这些元素初始化为0
- for (int i = 0; i < s.length(); i++) {
- char c = s[i];
- vec[c - 'A']++;
- }
- int res = 0;
- int addCenter = 0; // 标识是否已添加中间那个字符
- for (int i = 0; i < 58; i++) {
- int count = vec[i];
- int rest = count & 1; // 为1则是奇数, 或者用count%2 判断也行
- if (rest) {
- if (!addCenter) {
- res += count;
- addCenter = 1;
- }
- else {
- res = res + count - 1;
- }
- }
- else {
- res += count;
- }
- }
- return res;
- }
复制代码 测试代码:- void testLeeCode409() {
- Solution solution;
- string s = "abccccdd";
- cout << "longestPalindrome(abccccdd) : " << solution.longestPalindrome(s) << endl;
- }
复制代码 打印结果:
ok,提交到LeeCode:
ok
|