交叉字符串 给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。

来源:互联网 发布:优化方案 编辑:程序博客网 时间:2024/05/16 05:24
交叉字符串
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。您在真实的面试中是否遇到过这个题? Yes样例挑战标签相关题目 笔记比如 s1 = "aabcc" s2 = "dbbca"    - 当 s3 = "aadbbcbcac",返回  true.    - 当 s3 = "aadbbbaccc", 返回 false.
<pre name="code" class="html">如题,判断S3是否由S1和S2合并而成,S1和S2可以混合成,但不打乱它们原来的顺序比如,输入:(1)black board blackboard(2)black board boblaarcdk(3)black board boabdrlack输出:(1)yes(2)yes(3)no


class Solution {public:    /**     * Determine whether s3 is formed by interleaving of s1 and s2.     * @param s1, s2, s3: As description.     * @return: true of false.     */    bool isInterleave(string s1, string s2, string s3) {        // write your code here               if(s3.length()!=s1.length()+s2.length())              return false;          if(s1.length()==0)              return s2==s3;          if(s2.length()==0)              return s1==s3;          vector<vector<bool> > dp(s1.length()+1,vector<bool>(s2.length()+1,false));          dp[0][0] = true;          for(int i=1;i<=s1.length();i++)              dp[i][0] = dp[i-1][0]&&(s3[i-1]==s1[i-1]);          for(int i=1;i<=s2.length();i++)              dp[0][i] = dp[0][i-1]&&(s3[i-1]==s2[i-1]);          for(int i=1;i<=s1.length();i++)          {              for(int j=1;j<=s2.length();j++)              {                  int t = i+j;                  if(s1[i-1]==s3[t-1])                      dp[i][j] = dp[i][j]||dp[i-1][j];                  if(s2[j-1]==s3[t-1])                      dp[i][j] = dp[i][j]||dp[i][j-1];              }          }          return dp[s1.length()][s2.length()];                 }};


0 0