【ALGO】Leetcode 97.交錯字串

minuxAE發表於2020-10-29

題面

原題連結
給定三個字串 s1、s2、s3,請你幫忙驗證 s3 是否是由 s1 和 s2 交錯 組成的。
兩個字串 s 和 t 交錯 的定義與過程如下,其中每個字串都會被分割成若干 非空 子字串:
s = s1 + s2 + … + sn
t = t1 + t2 + … + tm
|n - m| <= 1
交錯 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …
提示:a + b 意味著字串 a 和 b 連線。

解析

使用DP求解,令 f [ i ] [ j ] f[i][j] f[i][j]表示所有由 s 1 [ 1 ∼ i ] s1[1\sim i] s1[1i] s 2 [ 1 ∼ j ] s2[1\sim j] s2[1j]交錯形成 s 3 [ 1 ∼ i + j ] s3[1\sim i+j] s3[1i+j]的方案,狀態計算時關鍵判斷 s 3 [ i + j ] s3[i+j] s3[i+j]的字元的來源為 s 1 s1 s1還是 s 2 s2 s2

AC程式碼

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int n=s1.size(), m=s2.size();
        if(s3.size()!=n+m) return false;

        bool f[n+1][m+1];
        memset(f, 0x00, sizeof f);
        s1=' '+s1, s2=' '+s2, s3=' '+s3;
        for(int i=0; i<=n; ++i)
            for(int j=0; j<=m; ++j)
                if(!i && !j) f[i][j]=true;
                else{
                    if(i && s1[i]==s3[i+j]) f[i][j]=f[i-1][j];
                    if(j && s2[j]==s3[i+j]) f[i][j]|=f[i][j-1];
                }
        return f[n][m];
    }
};

相關文章