最小字典序組合

題目

給定一個字符串類型的數組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);
		}
		
	}
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章