1. 程式人生 > 其它 >PCB疊層設計及特性阻抗計算

PCB疊層設計及特性阻抗計算

97. 交錯字串

給定三個字串 s1s2s3,請你幫忙驗證 s3 是否是由 s1s2 交錯 組成的。

兩個字串 st 交錯 的定義與過程如下,其中每個字串都會被分割成若干 非空 子字串:

  • 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 意味著字串 ab 連線。

示例 1:

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

示例 2:

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

示例 3:

輸入:s1 = "", s2 = "", s3 = ""
輸出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • s1s2、和 s3 都由小寫英文字母組成

思路:

​ 我的思路是帶備忘錄的動態規劃,與官方題解並不相同,但是官方題解的雙指標動態規劃更加巧妙。

class Solution {
public:
    vector<vector<int>>memo;
    bool isInterleave(string s1, string s2, string s3) {
        int m=s1.size();
        int n=s2.size();
        memo.resize(m+1,vector<int>(n+1,-1));//備忘錄 -1 表示未計算 0表示false 1表示true
        if((m+n)!=s3.size())return false;
        return dp(s1,0,s2,0,s3);
    }
    bool dp(string s1,int i,string s2,int j,string s3){
        if(i+j==s3.size())return true;
        int k=i+j;
        if(memo[i][j]!=-1){
            return memo[i][j]==1?true:false;
        }
        bool res=false;
        //下面兩種情況只要有一個滿足即可
        if(i<s1.size()&&s1[i]==s3[k]){//如果s1[i]可以和s3[k]匹配
            res = res|dp(s1,i+1,s2,j,s3);//或運算 有一個為真即可
        }
        if(j<s2.size()&&s2[j]==s3[k]){//如果s2[j]可以和s3[k]匹配
            res= res|dp(s1,i,s2,j+1,s3);
        }
        memo[i][j]=res==true?1:0;//res為真就存1 否則就存0
        return res;
    }
};