直接上题
刚拿到题,没想到其他的巧方法,就一根筋到底,直接一个个字符蛮力搞了,不过最后是可以得出一个对称的字符串的
class Solution {
public boolean canPermutePalindrome(String s) {
if(null == s){
return false;
}
if(1 == s.length()){
return true;
}
char [] chars = s.toCharArray();
int i = 0,j = chars.length - 1;
int index = -1;
int count = 0;
int num = chars.length / 2;
for(;;){
if( i == j || i > j){
return true;
}
if(chars[i] == chars[j]){
i ++;
j --;
continue;
}
index = findArrayIndex(chars, chars[i], i, j);
if(-1 == index){
if(0 == count && 1 == chars.length % 2 ){
char temp = chars[num];
chars[num] = chars[i];
chars[i] = temp;
count ++;
continue;
}
return false;
}
if(chars[i] != chars[j]){
char temp = chars[j];
chars[j] = chars[index];
chars[index] = temp;
}
i ++;
j --;
}
}
int findArrayIndex(char [] chars, char content, int index, int endIndex){
for(int i = index + 1;i < endIndex ; i ++){
if(index < endIndex && chars[i] == content){
return i;
}
}
return -1;
}
}
不过其实还有巧妙的方法,比如下面利用Set特性的方法,虽然得不到最后对称的字符串
存在偶数对的值,肯定被remove掉了,最后size = 0,存在一个值的数量3个及以上且为奇数,那么set里的元素肯定 >= 1,set里有一个元素在一种情况下是允许的,那就是奇数长度时中间可以单独放一个值;
字符串长度为偶数,且可以对称时,Set.size = 0
字符串长度为奇数,且可以对称时,Set.size = 1
字符串长度为奇数,且不可以对称时,Set.size > 1
综上 Set.size <= 1 的时候是可以得出是否存在对称字符串的
public boolean canPermutePalindrome(String s) {
if(null == s) return false;
if(1 == s.length()) return true;
char [] chars = s.toCharArray();
Set<Character> set = new HashSet();
for(int i = 0; i < chars.length;i ++){
if(set.contains(chars[i])){
set.remove(chars[i]);
}else {
set.add(chars[i]);
}
}
return set.size() <= 1;
}