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)
重点来分析第一个代码:
首先知道collections是什么?
collections是Python内建的一个集合模块,提供了许多有用的集合类;
Counter是dict的一个子类,是一个简单的计数器,例如,统计字符出现的个数v&1 这里也奇妙的很:
&1是快速判断一个数是不是奇数的运算方法,如果是,则等于1,如果不是则等于0
以后的判断奇数偶数,不要再用 %2==0,而用 &1 == 1
任何数转换成二进制,只有奇数的第一位会是1,偶数加偶数还是偶数