日新刷题 - 409. 最长回文串

93 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

一、题目描述:

409. 最长回文串 - 力扣(LeetCode)

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

在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。

 

示例 1:

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:

输入:s = "a"
输入:1

示例 3:

输入:s = "bb"
输入: 2

 

提示:

  • 1 <= s.length <= 2000
  • s 只能由小写和/或大写英文字母组成

二、思路分析:

求解过程
1、如果不存在出现奇数次的字符,结果为双数字符出现次数
2、如果存在出现奇数次的字符,把该字符大于1的次数计入到偶数出现次数中,单数出现次数最多只能记1次,结果为双数出现次数+1

具体实现
1、HashMap存储每个字符出现的次数
2、遍历HashMap,用shuang记录出现偶数次字符的出现次数,dan记录出现单数次字符的出现字数
3、结果如求解过程所示

三、AC 代码:

class Solution {
    public int longestPalindrome(String s) {
        if(s==null){
            return 0;
        }
        if(s.length()==1){
            return 1;
        }
        HashMap<Character,Integer> result = new HashMap<Character,Integer>();
        char[] str = s.toCharArray();
        for(char i : str){
            result.put(i,result.getOrDefault(i,0)+1);
        }
        int dan=0;
        int shuang=0;

        Set<Character> ans = result.keySet();
        for(char j : ans){
            if(result.get(j)%2==0){
                shuang+=result.get(j);
            }else if(result.get(j)>=3){
                shuang=shuang+result.get(j)-1;
                dan+=1;
            }else{
                dan++;
            }
        }
        return dan==0 ? shuang:shuang+1;
    }
}

四、参考:

用数组统计字母出现的各个字符分别出现的个数,偶数个就直接加上,奇数个就-1再加上 - 最长回文串 - 力扣(LeetCode)

统计字符频率,频率偶数直接相加,奇数时加上奇数-1判断 是否有中心元素无则+1 - 最长回文串 - 力扣(LeetCode)