zoukankan      html  css  js  c++  java
  • 767.重构字符串(优先队列排序)

    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.PriorityQueue;
    
    class Solution {
        public String reorganizeString(String S) {
            if (S.length() == 1)
                return S;
            //记录最大出现次数
            int maxCnt = 0;
            //记录各个字母出现次数
            HashMap<Character, Integer> map = new HashMap<>();
            //优先队列:按照字符出现次数从大到小排序
            PriorityQueue<Character> priorityQueue = new PriorityQueue<Character>(new Comparator<Character>() {
                @Override
                public int compare(Character pre, Character next) {
                    return map.get(next) - map.get(pre);
                }
            });
            for (int i = 0; i < S.length(); i++) {
                Character ch = S.charAt(i);
                map.put(ch, map.getOrDefault(ch, 0) + 1);
                maxCnt = Math.max(maxCnt, map.get(ch));
            }
            for (Character character : map.keySet()) {
                priorityQueue.add(character);
            }
            /*while(!priorityQueue.isEmpty()) {
                System.out.println(priorityQueue.poll());
            }*/
            //不符合直接返回""
            if (maxCnt > (S.length() + 1) / 2)
                return "";
            int flag = 0;
            StringBuilder sb = new StringBuilder();
            while (!priorityQueue.isEmpty()) {
                if (priorityQueue.size() == 1) {
                    flag = 1;
                    break;
                }
                Character pre = priorityQueue.poll();
    //            System.out.println(pre);
                sb.append(pre);
                Character next = priorityQueue.poll();
                sb.append(next);
    //            System.out.println(next);
                if (map.get(pre) > 1) {
                    map.put(pre, map.get(pre) - 1);
                    priorityQueue.add(pre);
                }
                if (map.get(next) > 1) {
                    map.put(next, map.get(next) - 1);
                    priorityQueue.add(next);
                }
            }
            if (flag == 1)
                sb.append(priorityQueue.poll());
            return sb.toString();
        }
    }

    链接:https://leetcode-cn.com/problems/reorganize-string/

     
  • 相关阅读:
    无有和无穷
    算法设计 熄灯问题
    WPF 路由事件总结
    C# params关键字
    WPF 布局总结
    C#结构体和类的区别
    C#装箱和拆箱(值类型和引用类型之间的转换)
    OpenGL中平移、旋转、缩放矩阵堆栈操作
    OpenGL图元的颜色属性
    OpenGL基础图形的绘制
  • 原文地址:https://www.cnblogs.com/yuanweidao/p/14292730.html
Copyright © 2011-2022 走看看