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;