拼接字符使其具有最低的字典序

给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字 符串拼起来之后形成的字符串具有最低的字典序。

思路:这是一道贪心题。如果先将数组给排序之后然后加起来是不对的。比如b < ba,但是bba,是大于bab的。 这道题的贪心策略是(a + b)< (b + a)的话就将a排在b的前面。
因为加起来之后字符串的长度就是一样的了,将数组排序贪心这种贪心策略不对的原因是如果字符串的长度不一样的话,短字符长度为len1,长字符长度为len2。如果前len1的字符都一样的话,这是就是短字符排在前面,但是会有一种情况就是第len1+1的字母是小于短字符开头的数字,这样的话就应该将长字符排在前面。

package Code07;

import java.util.Arrays;
import java.util.Comparator;

public class Code05_LowestString {
    public static class MyComparator implements Comparator<String>{
        @Override
        public int compare(String s1, String s2) {
            return (s1 + s2).compareTo(s2 + s1);
        }
    }

    public static String lowestString(String[] strs){
        if(strs == null || strs.length == 0){
            return null;
        }
        Arrays.sort(strs, (s1, s2) ->{return (s1 + s2).compareTo(s2 + s1);});
        String res = "";
        for(int i = 0; i < strs.length; i++){
            res += strs[i];
        }
        return res;
    }

    public static void main(String[] args){
        String[] strs1 = { "jibw", "ji", "jp", "bw", "jibw" };
        System.out.println(lowestString(strs1));

        String[] strs2 = { "ba", "b" };
        System.out.println(lowestString(strs2));
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值