举例:
- strs = [“abc”, “de”],可以拼接成 “abcde”,也可以拼接成 “deabc”,但前者的字典顺序更小,所以返回 “abcde”
- strs = [“b”, “ba”],可以拼成 “bba”,也可以拼成 “bab”,但前者的字典顺序更小,所以返回 “bab”。
基本思路:
有一种思路为:先把strs中的字符串按照字典顺序排序,然后将串起来的结果返回。这么做是错误的,例如【举例】中的第二条,按照字典顺序排应该是b、ba,串起来的结果是bba,但是正确答案是bab。所以这个思路行不通。正确的排序方式如下:
假设两个字符分别是a,b。a和b拼起来的字符串表示为a.b,那么如果a.b的字典顺序小于b.a,就把a放在前面,否则把b放在前面。每两个字符之间都按照这个标准进行比较,以此标准排序后,最后串起来的结果就是正确答案
import java.util.*; import java.util.Arrays; import java.util.Comparator; public class Solution { /** * * @param strs string字符串一维数组 the strings * @return string字符串 */ public static class MyComparator implements Comparator<String>{ public int compare(String a,String b){ return (a+b).compareTo(b+a); } } public String minString (String[] strs) { // write code here if(strs==null || strs.length==0){ return ""; } Arrays.sort(strs,new MyComparator()); StringBuffer res=new StringBuffer(); for(int i=0;i<strs.length;i++){ res.append(strs[i]); } return res.toString(); } }
import java.io.*; import java.util.*; public class Main{ public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int len = Integer.parseInt(br.readLine()); String[] arr = new String[len]; for(int i=0;i<len;i++){ arr[i] = br.readLine(); } String res = getRes(arr); System.out.println(res); } public static String getRes(String[] arr){ if(arr==null||arr.length==0) return null; if(arr.length<2) return arr[0]; Arrays.sort(arr,new Comparator<String>(){ public int compare(String o1,String o2){ return (o1+o2).compareTo(o2+o1); } }); StringBuilder sb = new StringBuilder(); for(int i=0;i<arr.length;i++){ sb.append(arr[i]); } return sb.toString(); } }