weekly contes 425。
Q2 難度突然降低超多,而且竟然沒陷阱。

題目

輸入兩個字串 s 和 t,兩者互為易位構詞
還有整數 k。

你的目標是判斷是否能把 s 分割成 k 個相同大小的子字串,然後重排變成 t。

若可能則回傳 true,否則回傳 false。

解法

原本應該判斷 N 是否能被 k 整除,但是題目很良心,保證能整除。

將 s, t 都切成 k 個子字串。
既然能重排,只要兩者是由個數相同的子字串組成即可。

可以使用雜湊表計數或將所有子字串排序後比對檢查。

時間複雜度 O(N)。
空間複雜度 O(N)。

class Solution:
    def isPossibleToRearrange(self, s: str, t: str, k: int) -> bool:
        N = len(s)
        sz = N // k
        d1 = Counter()
        d2 = Counter()
        for i in range(0, N, sz):
            sub1 = s[i:i+sz]
            d1[sub1] += 1
            sub2 = t[i:i+sz]
            d2[sub2] += 1

        return d1 == d2

使用排序判斷。

時間複雜度 O(N log k)。
空間複雜度 O(N)。

class Solution:
    def isPossibleToRearrange(self, s: str, t: str, k: int) -> bool:
        N = len(s)
        sz = N // k
        a1 = []
        a2 = []
        for i in range(0, N, sz):
            sub1 = s[i:i+sz]
            a1.append(sub1)
            sub2 = t[i:i+sz]
            a2.append(sub2)

        return sorted(a1) == sorted(a2)