266. Palindrome Permutation

Given a string, determine if a permutation of the string could form a palindrome.
For example,
"code"-> False,"aab"-> True,"carerac"-> True.

初看很简单, 26个字母存字符, 计算每个字符的奇偶数。
可是已测试发现输入串不仅仅是小写字符, 还有很多, 所以果断hashmap 或者char[256]. 代码如下, 可是发现只击败了不到20%的java code。 还有最开始有个印象只要找到一个基数就行了。改为set. 动态删减set值, 最后判断set.size(); 结果还是不超过20%。 继续!!!!看到个大神代码击败83%以上。
和set的思路很像, 不过他巧妙的用了boolean[256] 的数组存储。再加个count变量辅助。 完美!

public boolean canPermutePalindrome(String s) {
       boolean[] chars = new boolean[256];
       int count = 0;
       for(int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            count += chars[ch] ? -1 : 1;
            chars[ch] = ! chars[ch];
       }
      return count < 2;
}


public class Solution {   
     public boolean canPermutePalindrome(String s) {
            HashMapcharmap = new HashMap<>(); 
            for(int i = 0; i < s.length(); i++){
                     charmap.put(s.charAt(i), charmap.getOrDefault(s.charAt(i), 0) + 1);               }
            int odd = 0;
            Setkeyset = charmap.keySet();
            for(char key : keyset){
                    if(charmap.get(key) % 2 != 0){
                            odd++;
                     }
                    if(odd > 1 && s.length() % 2 == 0 || odd > 2 && s.length() % 2 ==1){
                             return false;
                   }
             }
            return true;
     }
}

Setcharset = new HashSet<>();
           for(int i = 0; i < s.length(); i++){
                   if(charset.contains(s.charAt(i))){
                         charset.remove(s.charAt(i));
                   }else{
                         charset.add(s.charAt(i));
                   }
           }
return charset.size() == 1 || charset.size() == 0;

你可能感兴趣的:(266. Palindrome Permutation)