力扣中國 · #97

交错字符串(Interleaving String)

使用二維動態規劃判斷 s3 是否可由 s1 和 s2 交錯組成,狀態轉移基於當前字元匹配來源。

開啟原題 ↗
時間複雜度O(mn)
空間複雜度O(mn)
解釋模型qwen/qwen3.8-27b

解題思路

本題採用動態規劃(Dynamic Programming)解決交錯字串問題。首先進行邊界檢查,若 s1 與 s2 的長度總和不等於 s3 的長度,直接回傳 False。接著建立一個 (l1+1) x (l2+1) 的布林矩陣 dp,其中 dp[i][j] 表示 s1 的前 i 個字元與 s2 的前 j 個字元能否交錯組成 s3 的前 i+j 個字元。初始化 dp[0][0] 為 True,並分別計算第一列與第一行的邊界情況(即僅由 s1 或僅由 s2 組成的情況)。在填表過程中,dp[i][j] 的狀態轉移取決於兩種情況:若 s2 的第 j 個字元與 s3 的當前字元匹配,且 dp[i][j-1] 為真;或若 s1 的第 i 個字元與 s3 的當前字元匹配,且 dp[i-1][j] 為真。最終 dp[l1][l2] 即為答案。

通過的程式碼

class Solution:
    def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
        l1 = len(s1)
        l2 = len(s2)
        l3 = len(s3)

        if l1 + l2 != l3:
            return False
        dp = [[False] * (l2+1) for i in range(l1+1)]
        dp[0][0] = True

        for i in range(1, l1+1):
            dp[i][0] = dp[i-1][0] and s1[i-1] == s3[i-1]
        for i in range(1, l2+1):
            dp[0][i] = dp[0][i-1] and s2[i-1] == s3[i-1]

        for i in range(1, l1+1):
            for j in range(1, l2+1):
                dp[i][j] = (dp[i][j-1] and s2[j-1] == s3[i+j-1] ) or ( dp[i-1][j] and s1[i-1]==s3[i+j-1])
        return dp[-1][-1]