題目
給定一個字符串類型的數組strs,找到一種拼接方式,使得把所有字符串拼起來之後形成的字符串具有最低的字典序.
解題思路
如果只有兩個字符,那麼我們期望的排序是當str1 + str2的拼接結果小於str2 + str1的拼接結果時,得到str1 + str2.也就是說希望String數組中每兩個字符串之間的排序規則都按照(str1 + str2).comparaTo(str2 + str1)的比較方式排序。
Arrays工具類剛好提供了sort方法可以傳自定義的比較器。所以我們可以定義比較器之後藉助Arrays.sort方法對String數組進行排序,排序之後的結果逐個拼接即可。
創建比較器
class StrComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
return (o1 + o2).compareTo(o2 + o1);
}
}
String類的comparaTo方法的比較方式是將兩個字符串存儲到兩個char類型數組中,兩個char數組從頭開始逐個比較,比較n次,n是較短的字符串的長度。如果比較過程中有不同則返回比較結果,如果所有字符都相同也就是長String包含了短String且剛好是開頭的幾個字符,則較長的字符串比較大。
String的comparaTo代碼如下
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
//獲取較短字符串的長度,用於後面循環比較
int lim = Math.min(len1, len2);
//將值存入char數組
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
//循環比較
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
//若按照char值沒有比較出來,返回長度差
return len1 - len2;
}
調用Arrays.comparaTo()方法後,strs中的字符串就按照我們想要的順序排列好了。依次拼接即可。
總體代碼如下:
import java.util.Arrays;
import java.util.Comparator;
public class BestArrage {
public static void main(String[] args) {
String [] strs = new String[]{"aa","bb","ba","ab"};
System.out.println(bestArrange(strs)); //aa ab ba bb
}
@SuppressWarnings("unused")
public static String bestArrange(String [] strs){
if(strs.length == 0 && strs == null){
return "";
}
Arrays.sort(strs,new BestArrage().new StrComparator());
String res = "";
for(int i = 0; i < strs.length; i++){
res += strs[i];
}
return res;
}
class StrComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
return (o1 + o2).compareTo(o2 + o1);
}
}
}