欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[409]最长回文串

程序员文章站 2024-01-22 11:07:22
...


链接

题目描述

[409]最长回文串

做法

1.自己的做法

遍历 s 中的每一个字符,对每一个字符放入到 map 中。
最后统计 map 中每个字符出现的次数

  • 如果是偶数,结果直接加这个数
  • 如果是奇数,结果加这个数减1,并且设置一个 boolean 类型变量记录是否出现了奇数

最后如果出现了奇数,那么最后结果要 +1 。

class Solution {
    public int longestPalindrome(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }       
        int res = 0;
        boolean single = false;
        HashMap<Character,Integer> map = new HashMap<>();
        for(Character c : s.toCharArray()){
            if(!map.containsKey(c)){
                map.put(c,1);
            }else{
                Integer temp = map.get(c);
                temp++;
                map.put(c,temp);
            }
        }
        for(Character c : map.keySet()){
            if(map.get(c) % 2 == 0){
                res += map.get(c);
            }else{
                res += map.get(c)-1;
                single = true;
                
            }
        }
        res = single == true ? res + 1 : res;


        return res;
    }
}

2. 位运算+只生成长度为58的数组

利用 int[ ] 代替 map。
计算(每个出现的字符 - ’ A ')放入 int[ ] 中。
并且在统计出现次数时利用了ans += n - (n&1),其中n&1 如果 n 是偶数,那么结果为0,;如果 n 为奇数,那么结果为1。
最后如果 结果 < s.length() ,说明一定出现了奇数,那么最终结果 +1 。

class Solution {
    public int longestPalindrome(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }
        int ans = 0;
        //这里之所以用58而不是56,ASCII表中,大写Z 和 小写a之间有6个特殊字符
        int[] help = new int[58];
        for(char c : s.toCharArray()){
            help[c - 'A'] += 1;
        }
        for(int n : help){
            ans += n - (n&1);//这里如果n是偶数,那么都是回文数,直接加;如果n是奇数,要减1
        }
        //如果最后ans长度小于s的长度,说明有奇数,那么ans+1作为最后结果
        ans = ans < s.length() ? ans + 1 : ans;
        return ans;
    }
}

3. 统计奇数的个数

class Solution {
    public int longestPalindrome(String s) {
        if(s == null || s.length() == 0){
            return 0;
        }
        int count = 0;
        int[] help = new int[128];
        for(char c : s.toCharArray()){
            help[c]++;
        }
        for(int n : help){
            count += n%2;//这里当然也可以改成 count += n & 1;
        }
        return count == 0 ? s.length() : (s.length()-count+1);
    }
}
相关标签: leetcode每日一题