zoukankan      html  css  js  c++  java
  • 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

    递归解法:每次比较s1和s3的最后一个字符或者s2和s3的最后一个字符,如果相等去掉两者的最后一个字符进入子问题,只要一个子问题返回true,父问题就返回true

     isInterleave(s1[0...n1], s2[0...n2], s3[0...n3]) = (s1[n1] == s3[n3] && isInterleave(s1[0...n1-1], s2[0...n2], s3[0...n3-1])) || (s2[n2] == s3[n3] && isInterleave(s1[0...n1], s2[0...n2-1], s3[0...n3-1]))

     1 class Solution {
     2 public:
     3     bool isInterleave(string s1, string s2, string s3) {
     4         // IMPORTANT: Please reset any member data you declared, as
     5         // the same Solution instance will be reused for each test case.    
     6         return isInterleaveRecur(s1, s1.length()-1, s2, s2.length()-1, s3, s3.length()-1);
     7     }
     8     bool isInterleaveRecur(string &s1, int end1, string &s2, int end2, string &s3, int end3)
     9     {
    10         if(end1 == -1 && end2 == -1 )
    11         {
    12             if(end3 == -1)
    13                 return true;
    14             else return false;
    15         }
    16         if(end1 >=0 && s1[end1] == s3[end3] && isInterleaveRecur(s1, end1-1, s2, end2, s3, end3-1))
    17             return true;
    18         if(end2 >=0 && s2[end2] == s3[end3] && isInterleaveRecur(s1, end1, s2, end2-1, s3, end3-1))
    19             return true;
    20         return false;
    21     }
    22 };

    动态规划解法:根据递归的思想,我们一刻如下使用动态规划解此题。设dp[i][j]表示s1[0...i-1]和s2[0...j-1]能否组合成s3[0....i+j-1],动态规划方程如下                                                                               本文地址

    • dp[i][j] = (dp[i][j-1] ==true && s3[i+j-1] == s2[j-1]) || (dp[i-1][j] == true && s3[i-1+j] == s1[i-1])
    • 初始条件:if(s1[0] == s3[0])dp[1][0] = true  ,  if(s2[0] == s3[0])dp[0][1] = true; 其他值均为false
     1 class Solution {
     2 public:
     3     bool isInterleave(string s1, string s2, string s3) {
     4         // IMPORTANT: Please reset any member data you declared, as
     5         // the same Solution instance will be reused for each test case.    
     6         const int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
     7         if(len1 == 0)return s2 == s3;
     8         else if(len2 == 0)return s1 == s3;
     9         // dp[i][j]表示s1[0...i-1]和s2[0...j-1]能否组合成s3[0....i+j-1]
    10         bool dp[len1+1][len2+1];
    11         memset(dp, 0, sizeof(dp));
    12         if(len3 != 0)
    13         {
    14             if(s1[0] == s3[0])dp[1][0] = true;
    15             if(s2[0] == s3[0])dp[0][1] = true;
    16         }
    17         else return false;// len3 = 0,但是len1和len2不等于0
    18         if(len1 + len2 != len3)return false;//长度关系不满足
    19         for(int i = 0; i <= len1; i++)
    20             for(int j = 0; j <= len2; j++)
    21             {
    22                 int tmp = i+j-1;
    23                 if(j > 0)
    24                 {
    25                     if(dp[i][j-1] && s3[tmp] == s2[j-1])
    26                         {dp[i][j] = true; continue;}
    27                 }
    28                 if(i > 0)
    29                 {
    30                     if(dp[i-1][j] && s3[tmp] == s1[i-1]) 
    31                         dp[i][j] = true;
    32                 }
    33             }
    34         if(dp[len1][len2])return true;
    35         else return false;
    36     }
    37 };

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3448469.html

  • 相关阅读:
    彩色文件夹、彩色文件、图标标记(MultiColorWin)快速操作
    git 国内源
    Mysql 日期格式化 复杂日期区间查询
    项目版本管理Git使用详细教程
    SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑
    SpringBoot Spring Security 核心组件 认证流程 用户权限信息获取详细讲解
    SpringBoot包扫描之多模块多包名扫描和同类名扫描冲突解决
    初阶绘图
    变量与档案存取
    结构化程式和自定义函数
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3448469.html
Copyright © 2011-2022 走看看