给定一个非空字符串str和一个整数k,请重新排列该字符串,以使相同字符之间的距离至少为k。
所有输入字符串均以小写字母给出。如果无法重新排列字符串,则返回一个空字符串“”。
例:
str =“ aabbcc”,k = 3
结果:“ abcabc”
相同字母之间的距离至少为3。
Java解决方案
public String rearrangeString(String str, int k) {
if(k==0)
return str;
//initialize the counter for each character
final HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for(int i=0; i<str.length(); i++){
char c = str.charAt(i);
if(map.containsKey(c)){
map.put(c, map.get(c)+1);
}else{
map.put(c, 1);
}
}
//sort the chars by frequency
PriorityQueue<Character> queue = new PriorityQueue<Character>(new Comparator<Character>(){
public int compare(Character c1, Character c2){
if(map.get(c2).intValue()!=map.get(c1).intValue()){
return map.get(c2)-map.get(c1);
}else{
return c1.compareTo(c2);
}
}
});
for(char c: map.keySet())
queue.offer(c);
StringBuilder sb = new StringBuilder();
int len = str.length();
while(!queue.isEmpty()){
int cnt = Math.min(k, len);
ArrayList<Character> temp = new ArrayList<Character>();
for(int i=0; i<cnt; i++){
if(queue.isEmpty())
return "";
char c = queue.poll();
sb.append(String.valueOf(c));
map.put(c, map.get(c)-1);
if(map.get(c)>0){
temp.add(c);
}
len--;
}
for(char c: temp)
queue.offer(c);
}
return sb.toString();}
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。