返回所有拼接结果中字典序最小的结果

98 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给定一个字符串数组,里面有很多的元素,我们让他们前后随意拼接,最后拼接结果中最小的那个。

思路

这个题目我们用贪心策略,那我们的贪心策略有哪些呢?

我们可以试试把最小的元素放在前面来拼接,我相信大家的第一想法应该是这个。但是这个是有反例的。

"b","ba"

上面那个数组的正确拼接应该是bab,但是如果按照上面的贪心策略我们拼出来的是bba

所以我们要放弃上面的想法,我们知道,我们最后比较的是拼接之后的大小,那我们直接拿拼接之后的对象比较不就好了嘛

我们让两个元素先拼接到一起,然后我们比较他们拼接的两种方式谁比较小这样的方式来排序,排序之后我们再让他们拼接就可以了。

举例

【"cd","a","e"】

我们先拿到第一个元素和第二个元素:"cd" , "a" 我们比较他们两个之间的拼接顺序,就是比较"acd" 和 "cda"

然后我们知道"acd"是小于"cda"

所以"a"排在"cd"前面.z

按照上面的顺序,我们知道cd应该在e的前面。

我们这边只是说一下排序的样子,没有说这样就排序好了。

最后排序好的结果就是【"a","cd","e"】

代码

比较器

public static class Com implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return (o1 + o2).compareTo(o2 + o1);
    }
}

这个比较器就是思路里面写到的,比较两个字符串拼接之后的大小来安排谁在前面谁在后面。

实现方法

public static String lowestString(String[] strs){
    if(strs == null || strs.length == 0){
        return "";
    }
    Arrays.sort(strs , new Com());
    StringBuilder string = new StringBuilder();
    for(int i = 0;i<strs.length;i++){
        string.append(strs[i]);
    }
    return string.toString();
}

这个就是用Arrays.sort在排序好之后,就可以拼接了。