[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);
    }
}
发布了55 篇原创文章 · 获赞 1 · 访问量 872

猜你喜欢

转载自blog.csdn.net/weixin_42469108/article/details/104978753
今日推荐