【问题标题】:What does "dp[0][i2] = dp[0][i2 - 1] && s2[i2 - 1] == s3[i2 - 1];" this mean?“dp[0][i2] = dp[0][i2 - 1] && s2[i2 - 1] == s3[i2 - 1];”是什么意思?这个意思?
【发布时间】:2021-06-10 11:38:30
【问题描述】:

谁能帮我解决这个疑问:

bool isInterleave(string s1, string s2, string s3) {
        int n1 = (int)s1.size(), n2 = (int)s2.size(), n3 = (int)s3.size(); 
        if(n1 + n2 != n3) return false;
        
        vector<vector<bool>> dp(n1 + 1, vector<bool>(n2 + 1, false));
        dp[0][0] = true;
        
        for(int i2 = 1; i2 <= n2; i2++) dp[0][i2] = dp[0][i2 - 1] && s2[i2 - 1] == s3[i2 - 1];
        for(int i1 = 1; i1 <= n1; i1++) dp[i1][0] = dp[i1 - 1][0] && s1[i1 - 1] == s3[i1 - 1];

        for(int i1 = 1; i1 <= n1; i1++){
            for(int i2 = 1; i2 <= n2; i2++){
                dp[i1][i2] = (dp[i1 - 1][i2] && s1[i1 - 1] == s3[i1 + i2 - 1]) || (dp[i1][i2 - 1] && s2[i2 - 1] == s3[i1 + i2 - 1]);
            }
        }
        
        return dp[n1][n2];  
    }

我想知道下面这行的意思:

for(int i2 = 1; i2 &lt;= n2; i2++) dp[0][i2] = dp[0][i2 - 1] &amp;&amp; s2[i2 - 1] == s3[i2 - 1];

它是在执行一些条件检查还是什么?

我在阅读一些与动态编程相关的问题时得到了这个声明。

【问题讨论】:

    标签: c++ dynamic-programming


    【解决方案1】:

    这是测试两个条件并分配逻辑结果的简洁形式。

    dp[0][i2] = dp[0][i2 - 1] && s2[i2 - 1] == s3[i2 - 1]
    
    dp[0][i2] = ((dp[0][i2 - 1] != false) && (s2[i2 - 1] == s3[i2 - 1]))) ? true : false;
    
    if ((dp[0][i2 - 1] != false) && (s2[i2 - 1] == s3[i2 - 1])))
    {
      dp[0][i2] = true;
    }
    else
    {
      dp[0][i2] = false;
    }  
    

    【讨论】:

    • 请注意dp[][] 元素是bool 而不是int
    【解决方案2】:
    for(int i2 = 1; i2 <= n2; i2++){
        dp[0][i2] = dp[0][i2 - 1] && s2[i2 - 1] == s3[i2 - 1];
    }
    

    上面的 for 循环在[1, n2] 范围内进行迭代,即1n2,包括两者。

    dp 是一个存储布尔值的二维数组,其中布尔值是根据 dp 数组同一行的前一列值计算的,即此处的第 0 行,并检查字符串 s2s3 是否相同索引i2-1处的字符。

    让我举个例子来说明一下:-

    假设你的 dp 数组如下:-

    -----------------------------
    | True | True | False| True |
    | True | False| True | True |
    | False| True | False| True |
    -----------------------------
    

    它有 3 行 4 列。

    还让我们考虑如下两个字符串:-

    s2 = "根" s3 = "鼹鼠"

    由于代码仅迭代第 0 行,因此我们将您的 i2 视为 2

    如您所见,dp[0][i2] = "False"dp[0][i2-1] = "True" i2 为 2

    当您比较索引 i2-1 处的字符串 s1 和 s2 中的字符(即 1)时,s1[i2-1] == s2[i2-1] 为真,因为两个位置的字符相同:s1[i2-1] = s2[i2-1] = 'O'

    所以结合条件dp[0][i2 - 1] &amp;&amp; s2[i2 - 1] == s3[i2 - 1] 会给你True &amp;&amp; True 这是True,代码会将d​​p[0][i2] 的值更新为True

    【讨论】:

      【解决方案3】:
      for(int i2 = 1; i2 <= n2; i2++){ 
           dp[0][i2] = dp[0][i2 - 1] && s2[i2 - 1] == s3[i2 - 1];
      }
      

      每个表达式都返回一个值,表达式s2[i2 - 1] == s3[i2 - 1] 将产生10。 当使用&amp;&amp; 运算符时,它将所有内容转换为布尔值。每个非零值都被视为1,每个零值都被视为0。因此像(3 &amp;&amp; 6) 这样的表达式将返回1


      dp[0][i2 - 1] &amp;&amp; s2[i2 - 1] == s3[i2 - 1] 将以相同的方式进行评估。 ==&amp;&amp; 具有更多的存在性,因此将首先对其进行评估。所以s2[i2 - 1] == s3[i2 - 1] 将返回一个布尔值,然后将使用dp[0][i2 - 1] &amp;&amp; x 对其进行评估,其中x 是从s2[i2 - 1] == s3[i2 - 1] 返回的值。它最终将评估为一个布尔值,该值将存储在dp[0][i2]

      【讨论】:

        猜你喜欢
        • 2019-11-04
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 2018-09-25
        • 2011-03-21
        • 2015-05-27
        • 2023-02-02
        • 2013-02-01
        相关资源
        最近更新 更多