重构字符串

给定一个字符串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 map=new HashMap();

        for(int j=0;j entry:map.entrySet()){

            if(entry.getValue()>l){

                l=entry.getValue();

                ml=entry.getKey();

            }

        }

        if(l>(len+1)/2)

           return "";

        PriorityQueueque=new PriorityQueue(new Comparator(){

            public int compare(int m[],int n[]){

                return n[1]-m[1];

            }

        });

       for(Map.Entry 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);

    }

你可能感兴趣的:(重构字符串)