【Lintcode】1025. Custom Sort String

記錄演算法發表於2020-12-11

題目地址:

https://www.lintcode.com/problem/custom-sort-string/description

給定兩個字串 s s s t t t,題目保證兩者都只含英文小寫字母,並且 s s s裡無重複字母。要求重排 t t t,使得 t t t的字母順序是按照 s s s裡字母順序定義的。不在 s s s裡的字母隨便排在哪兒。返回任意一個重排的結果即可。

先統計一下 t t t的每個字母出現次數,以雜湊表 c c c表示,然後再遍歷 s s s,如果 s [ i ] s[i] s[i]出現了,則append到一個StringBuilder後面 c [ s [ i ] ] c[s[i]] c[s[i]]這麼多次。最後再把沒出現的字母也依次append到StringBuilder後面即可。程式碼如下:

public class Solution {
    /**
     * @param S: The given string S
     * @param T: The given string T
     * @return: any permutation of T (as a string) that satisfies this property
     */
    public String customSortString(String S, String T) {
        // Write your code here
        int[] count = new int[26];
        for (int i = 0; i < T.length(); i++) {
            count[T.charAt(i) - 'a']++;
        }
        
        StringBuilder sb = new StringBuilder();
        // 先處理S裡有的字母
        for (int i = 0; i < S.length(); i++) {
            int idx = S.charAt(i) - 'a';
            while (count[idx] > 0) {
                sb.append((char) ('a' + idx));
                count[idx]--;
            }
        }
    
    	// 再處理沒有的
        for (int i = 0; i < count.length; i++) {
            if (count[i] == 0) {
                continue;
            }
    
            for (int j = 0; j < count[i]; j++) {
                sb.append((char) ('a' + i));
            }
        }
        
        return sb.toString();
    }
}

時空複雜度 O ( l t ) O(l_t) O(lt)

相關文章