409. [LeetCode]Longest Palindrome

原题地址

java答案:

public class Solution {

    public boolean isSingle(int number){ // isOdd
        if(number%2 == 0) return false;
        return true;
    }

    public int chooseChar(char c){
        if(c>='A' && c<='Z') return 1;
        else if(c>='a' && c<='z') return 2;
        else return 0;
    }

    public int longestPalindrome(String s) {
        int count = 0;
        int size = s.length();
        int[] chars = new int[52];
        for(int i=0;i<size;i++){
            char temp = s.charAt(i);
            if(chooseChar(temp)== 1){
                chars[(int)(temp - 'A')]++;
            } else if(chooseChar(temp) == 2){
                chars[26+(int)(temp - 'a')]++;
            }
        }
        Arrays.sort(chars);
        for(int i = 51;i>=0;i--){
            if(isSingle(chars[i])){
                count += chars[i];
                chars[i] = 0;
                break;
            }
        }
        for(int i = 51;i>=0;i--){
            if(isSingle(chars[i])){
               count += chars[i]-1;
            } else {
               count += chars[i];
            }
        }
        return count;
    }
}

python答案,大神算法分析:

这里用了逆向思维,不是求可以构成回文的字符有哪些,而是求不能构成回文的字符有哪些,然后用总的字符减去不能构成回文的字符

odds 是 奇数个数的字符数

bool(odds):此处有则加一,无则不加

python中 True == 1

def longestPalindrome(self, s):
    odds = sum(v & 1 for v in collections.Counter(s).values())
    return len(s) - odds + bool(odds)

重点来分析第一个代码:

  1. 首先知道collections是什么?

    collections是Python内建的一个集合模块,提供了许多有用的集合类;
    Counter是dict的一个子类,是一个简单的计数器,例如,统计字符出现的个数

  2. v&1 这里也奇妙的很:
    &1是快速判断一个数是不是奇数的运算方法,如果是,则等于1,如果不是则等于0
    以后的判断奇数偶数,不要再用 %2==0,而用 &1 == 1
    任何数转换成二进制,只有奇数的第一位会是1,偶数加偶数还是偶数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值