LC409 - 最长回文串 - HashMap记录每个字符出现的次数

1. 题目

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

2. 思路

  1. 用HashMap记录每个字符出现的次数
  2. 如果某字母有偶数个,因为偶数有对称性,可以把它全部用来构造回文串;但如果是奇数个的话,并不是完全不可以用来构建,也不是只能选最长的那个,而是只要砍掉1个,剩下的变成偶数就可以全部计入了。也就是假设它出现了 v 次,我们可以使用该字符 v / 2 * 2 次
  3. 如果有任何一个字符 ch 的出现次数 v 为奇数(即 v % 2 == 1),那么可以将这个字符作为回文中心,注意只能最多有一个字符作为回文中心。

3. 知识点

HashMap中所有value的集合表示为:
Collection<Integer> values = map.values();

4.代码

class Solution {
    public int longestPalindrome(String s) {
        char[] array = s.toCharArray();
        //HashMap存储每个字符出现的次数
        HashMap<Character, Integer> map = new HashMap<>();
        for(char ch: array) {
        	map.put(ch, map.getOrDefault(ch, 0) + 1);
        }
        int res = 0;
        Collection<Integer> values = map.values();
        for(int v: values){
            res += v/2*2;//所有出现次数>=2的数取偶数累加
            if(v % 2 == 1 && res % 2 == 0){//如果res还是偶数次,则可以+1,如果res已经是奇数次了,则不再+1,达到只加一次的目的
                res++;
            }
        }
        return res;      
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值