重构字符串

给定一个字符串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);

    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容