1. 程式人生 > >【LeetCode】97. 交錯字串

【LeetCode】97. 交錯字串

題目描述

給定三個字串 s1s2s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。

示例 1:

輸入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
輸出: true

示例 2:

輸入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
輸出: false

思路

字串匹配的問題大多用動態規劃,若出現第三個字串要找到第三個字串與前兩個字串的關係!

在此題中,s3 的長度一定等於 s1 和 s2 的長度之和,否則一定返回為空;

dp[ i ][ j ] 表示 s1 的前 i 個字元和 s2 的前 j 個字元是否匹配 s3 的前 i + j 個字元;

s1[ i - 1] == s3[ i + j - 1] 時,dp[ i ][ j ] = dp[ i - 1][ j ];

s2[ j - 1] == s3[ i + j - 1] 時,dp[ i ][ j ] = dp[ i ][ j - 1];

注意:這兩個判斷結果應該取 ||,而不是先後兩個 if 的關係。

程式碼

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        if(s1.empty() && s2.empty() && s3.empty())
            return true;
        int m = s1.size();
        int n = s2.size();
        int k = s3.size();
        if(m + n != k) return false;
        vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
        dp[0][0] = true;
        for(int i=1; i<=m; i++)
            if(s1[i-1] == s3[i-1])
                dp[i][0] = dp[i-1][0];
        for(int i=1; i<=n; i++)
            if(s2[i-1] == s3[i-1])
                dp[0][i] = dp[0][i-1];
        for(int i=1; i<=m; i++){
            for(int j=1; j<=n; j++){
                dp[i][j] = dp[i-1][j] && s1[i-1] == s3[i+j-1] || dp[i][j-1] && s2[j-1] == s3[i+j-1];
            }
        }
        return dp[m][n];
    }
};