给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab"
输出: "aba"
先利用hashmap存储每个元素出现的次数,如果最大出现次数大于字符串长度的一半则返回false,之后利用大根堆按照元素出现次数进行排序(需要重写comparator方法),之后按照出现次数从大到小的顺序取出,将其依次放在答案数组的奇数下标上,每放一次将其出现次数-1,直到次数用尽,当下标越界时重新开始填充偶数下标,当堆中元素全被取出且插入完成后,ans数组也构建完毕。
public String reorganizeString(String S) {
int len=S.length();
int l=0;
char ml='a';
char[] ans=new char[len];
HashMap<Character,Integer> map=new HashMap();
for(int j=0;j<len;j++){
char i=S.charAt(j);
map.put(i,map.getOrDefault(i,0)+1);
}
for(Map.Entry<Character,Integer> entry:map.entrySet()){
if(entry.getValue()>l){
l=entry.getValue();
ml=entry.getKey();
}
}
if(l>(len+1)/2)
return "";
PriorityQueue<int[]>que=new PriorityQueue(new Comparator<int[]>(){
public int compare(int m[],int n[]){
return n[1]-m[1];
}
});
for(Map.Entry<Character,Integer> entry:map.entrySet()){
que.offer(new int[]{entry.getKey(),entry.getValue()});
}
int num=0;
int index=0;
while(que.size()>0){
char ch=(char)que.peek()[0];
int count=que.peek()[1];
que.poll();
while(count>0){
ans[index]=ch;
index+=2;
count--;
if(index>ans.length-1)
index=1;
}
}
return String.copyValueOf(ans);
}