#LeetCode
题目描述
初次解法
class Solution {
public boolean canPermutePalindrome(String s) {
// 排列后判断奇数集合个数
int len = s.length();
char[] strArr = s.toCharArray();
Arrays.sort(strArr);
int low = 0;
int res = 0;
if (len == 1) return true;
for(int i = 0; i < len - 1; i ++){
if(strArr[i] != strArr[i+1]){
if((i - low + 1) % 2 == 1){
res ++;
}
low = i + 1; //每次子集结束变动,low重新定位,定位为集合第一个元素的位置
}
}
//最后一个集合的数量需要单独判断
if ((len - low) % 2 == 1) {
res++;
}
if (res <= 1) return true;
else return false;
}
}
优化解法
class Solution {
public boolean canPermutePalindrome(String s) {
// 按照常见字符ASCII码表构建数组,依次遍历递增,最后判断奇数集数量
int[] letter_list = new int[128];
char[] charArr = s.toCharArray();
int flag = 0;
for(int i = 0; i < s.length(); i ++){
int index = charArr[i] - ' ';
letter_list[index] ++;
}
for(int i = 0; i < 128; i ++){
if(letter_list[i] % 2 !=0){
flag ++;
}
}
return flag > 1 ? false:true;
}
}
三次优化
- 优化代码结构
class Solution {
public boolean canPermutePalindrome(String s) {
// 按照常见字符ASCII码表构建数组,依次遍历递增,最后判断奇数集数量
int[] letter_list = new int[128];
char[] charArr = s.toCharArray();
boolean flag = true;
for(char c:charArr){
letter_list[c] ++;
}
for(int i:letter_list){
if (flag && i % 2 != 0){
flag = false;
}else if(i % 2 != 0){
return false;
}
}
return true;
}
}
- 还可以用字典或者哈希表,但我不写了