[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 };

 

posted @ 2017-07-06 20:35  王大咩的图书馆  阅读(291)  评论(0编辑  收藏  举报