春招打卡d11n18-leetcode刷题409最长回文串

119 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题409最长回文串

前文

本文为leetcode字符串操作类型题目,题目序号为409,主要考察操作字符串遍历角度的效率。

题目信息

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

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

解题思路

根据题目信息可知,本题目主要考察对于字符串的操作。给定一个字符串,想要得到其中能够组成的最长回文数。由于回文数是一个对称的数字,因此我们可以从偶数的角度操作。首先记录所有字符串出现的次数,然后进行记录。最后根据记录的结果,统计所有的偶数数目即可。如果不足,那么再增加一。但要注意,笔者也犯了该错误,也就是超过2的奇数同样要记录n-1到最终结果中,保证不会出现字母的漏记。至此,按照这种方式即可得到题目答案,时间复杂度o(n)。

解题代码

public int longestPalindrome(String s) {
    Map<String,Integer> map = new HashMap<>();
    int length = s.toCharArray().length;
    for (int i = 0; i < length; i++) {
        String key = String.valueOf(s.charAt(i));
        map.put(key,map.getOrDefault(key,0) + 1);
    }
    int cnt = 0;
    for (int i = 0; i < map.values().toArray().length; i++) {
        Integer item = (Integer) map.values().toArray()[i];
        if(item.intValue() % 2 == 0){
            cnt += item.intValue();
        }else if(item.intValue() >= 3){
            cnt += item.intValue() - 1;
        }
    }
    if(cnt != length){
        cnt++;
    }
    return cnt;
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。