Given s1, s2, s3, 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 ii和edit 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 };