给定一个字符串类型的数组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));
}
}