• [Leetcode] interleaving string 交织的字符串


    Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

    For example,
    Given:
    s1 ="aabcc",
    s2 ="dbbca",

    When s3 ="aadbbcbcac", return true.
    When s3 ="aadbbbaccc", return false.

    题意:判断s3是否可以由s1和s2交错形成。

    思路:动态规划。 若可以形成s3,必须满足的一个条件是s1和s2的长度和等于s3的长度,否则肯定不能满足。维护一个二维数组,dp[i][j]表示字符串s.substr(0,i)和s2.substr(0,j),可以交错组成s3.substr(i+j-1)(substr()的区间是前闭后开)。二维数组的求值的过程其实和unique paths iiedit distance有点类似。到达二维数组dp中某一点dp[i][j]有两种方式,从左或从上,从左到达该点意味着,在dp[i][j-1]的基础上加上一个字符s2[j-1]看是否能构成s3[i+j-1],所以能构成有两个条件,第一是,dp[i][j-1]要为true,第二是s2[j-1]要和s3[i+j-1]相等,即对应的字符相等,即满足:dp[i][j-1]&&s2[j-1]==s3[i+j-1]为true,同理,从上到达要满足:dp[i-1][j]&&s1[i-1]==s3[i+j-1],当s1和s2中有一个为空时,数组dp对应的值是false还是true,就用不用空的那个和s3一一的对比就行,当两个字符串都是为空时,s3也应该为空,此时dp[0][0]为true。如题中的例子:

    (注:图总列的最后一个字符应该为 a 不是 c 笔误,分析图是正确的)

    代码如下:参考了Grandyang的博客

     1 class Solution {
     2 public:
     3     bool isInterleave(string s1, string s2, string s3) 
     4     {
     5         int len1=s1.size(),len2=s2.size(),len3=s3.size();
     6         if(len1+len2 !=len3)    return false;
     7 
     8         vector<vector<bool>> dp(len1+1,vector<bool>(len2+1,false));
     9         dp[0][0]=true;
    10 
    11         for(int i=1;i<=len1;++i)
    12             dp[i][0]=dp[i-1][0]&&s1[i-1]==s3[i-1];
    13         for(int i=1;i<=len2;++i)
    14             dp[0][i]=dp[0][i-1]&&s2[i-1]==s3[i-1];
    15 
    16         for(int i=1;i<=len1;++i)
    17         {
    18             for(int j=1;j<=len2;++j)
    19             {
    20                 dp[i][j]=(dp[i-1][j]&&s1[i-1]==s3[i+j-1])||
    21                          (dp[i][j-1]&&s2[j-1]==s3[i+j-1]);
    22             }
    23         }
    24         return dp[len1][len2]; 
    25     }
    26 };
  • 相关阅读:
    谷粒商城所学知识点整理总结
    谷粒商城项目介绍
    JVM 中的垃圾回收
    对象的创建和分配
    JVM 中的异常
    JVM 中的StringTable
    一个 java 文件的执行过程详解
    复制表的方法
    从 Vue parseHTML 来学习正则表达式
    Visual Studio 2022 预览版下载来了(x64位)
  • 原文地址:https://www.cnblogs.com/love-yh/p/7128238.html
Copyright © 2020-2023  润新知