409. [LeetCode]Longest Palindrome

来源:互联网 发布:系统数据保护在哪里 编辑:程序博客网 时间:2024/04/30 11:33

原题地址

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
原创粉丝点击