import java.util.*;

/**
 * NC85 拼接所有的字符串产生字典序最小的字符串
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param strs string字符串一维数组 the strings
     * @return string字符串
     */
    public String minString (String[] strs) {
        // return solution1(strs);
        return solution2(strs);
    }

    /**
     * 贪心: 数组排序
     * @param strs
     * @return
     */
    private String solution1(String[] strs){
        // "bc" "bca"
        // 直接比较字典 bc<bca              => bcbca
        // 连接比较字典 bc>bca(bcbca>bcabc) => bcabc
        Arrays.sort(strs, new Comparator<String>(){
            @Override
            public int compare(String o1, String o2){
                return (o1+o2).compareTo(o2+o1);
            }
        });

        StringBuilder sb = new StringBuilder();
        for(String str: strs){
            sb.append(str);
        }

        return sb.toString();
    }

    /**
     * 贪心: 优先队列(小根堆)
     * @param strs
     * @return
     */
    private String solution2(String[] strs){
        // "bc" "bca"
        // 直接比较字典 bc<bca              => bcbca
        // 连接比较字典 bc>bca(bcbca>bcabc) => bcabc
        PriorityQueue<String> minHeap = new PriorityQueue<>((o1, o2) -> (o1+o2).compareTo(o2+o1));

        for(String str: strs){
            minHeap.offer(str);
        }

        StringBuilder sb = new StringBuilder();
        while(!minHeap.isEmpty()){
            sb.append(minHeap.poll());
        }

        return sb.toString();
    }
}