LeetCode 409. 最长回文串

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 409. 最长回文串相关的知识,希望对你有一定的参考价值。

截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666




public int longestPalindrome(String s) {
    int[] map = new int[256];
    //统计每个字符的个数
    for (char ch : s.toCharArray())
        map[ch]++;
    int res = 0;
    int mask = -2;
    for (int count : map) {
        //每个字符的个数取最大偶数,然后相加
        res += count & mask;
    }
    //如果相加的和小于字符串的长度,最后还要加1
    return res < s.length() ? res + 1 : res;
}

上面可能不容易理解的是这样一行代码

res += count & mask;

因为mask是-2,count&-2的意思就是如果count是偶数,计算的结果还是count,如果count是奇数,计算的结果是count-1。直接看可能不直观,把-2转化为二进制就明白了。

11111111 11111111 11111111 11111110

除了上面的统计方式以外,我们还可以使用集合Set来统计,代码如下

public int longestPalindrome(String s) {
    int res = 0;
    Set<Character> set = new HashSet<>();
    for (char ch : s.toCharArray()) {
        //如果set中有字符ch,remove方法会
        //返回true,否则返回false
        if (set.remove(ch)) {
            //当前字符ch,出现了2次
            res += 2;
        } else {
            //当前字符ch,只出现1次
            set.add(ch);
        }
    }
    return res + (set.isEmpty() ? 0 : 1);
}

或者还可以这样写,但不管怎么写,原理还是不变的,换汤不换药。

public int longestPalindrome(String s) {
    boolean[] map = new boolean[256];
    int res = 0;
    for (int i = 0; i < s.length(); i++) {
        res += map[s.charAt(i)] ? 2 : 0;
        map[s.charAt(i)] = !map[s.charAt(i)];
    }
    return res < s.length() ? res + 1 : res;
}

以上是关于LeetCode 409. 最长回文串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode--409--最长回文串

LeetCode409 最长回文串

LeetCode 409. 最长回文串

LeetCode409. 最长回文串,利用桶装法,偶数直接加入总数,且对于奇数仅记录一次

LeetCode409. 最长回文串,利用桶装法,偶数直接加入总数,且对于奇数仅记录一次

LeetCode 0409. 最长回文串