zoukankan      html  css  js  c++  java
  • [LeetCode] 97. Interleaving String

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

    Example 1:

    Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
    Output: true
    

    Example 2:

    Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
    Output: false

    交错字符串。题意是给 s1, s2 和 s3,验证 s3 是否是由 s1 和 s2 交错组成的。这是典型的二维DP题,设DP[i][j]是s1的前i个字符 + s2的前j个字符组成的结果是否能跟s3的前i + j个字符匹配。首先排除corner case,如果s1 + s2的长度不等于s3,则说明是不行的。另外,还需要先在二维数组中计算出当s1为空和当s2为空的时候相对应的DP值。最后normal case是这两种其中一种为true则dp[i][j]为true。

    • s1的前i - 1个字符 + s2的前j个字符
    • s1的前i个字符 + s2的前j - 1个字符

    其实也就是s1和s2拼接出来的部分的最后一个字符可来自于s1也可来自于s2,只要有一种情况为true则整体就为true。

    时间O(mn)

    空间O(mn)

    Java实现

     1 class Solution {
     2     public boolean isInterleave(String s1, String s2, String s3) {
     3         // corner case
     4         if ((s1.length() + s2.length()) != s3.length()) {
     5             return false;
     6         }
     7 
     8         boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
     9         dp[0][0] = true;
    10 
    11         // when s2 is empty
    12         for (int i = 1; i < dp.length; i++) {
    13             dp[i][0] = dp[i - 1][0] && (s1.charAt(i - 1) == s3.charAt(i - 1));
    14         }
    15 
    16         // when s1 is empty
    17         for (int i = 1; i < dp[0].length; i++) {
    18             dp[0][i] = dp[0][i - 1] && (s2.charAt(i - 1) == s3.charAt(i - 1));
    19         }
    20 
    21         for (int i = 1; i < dp.length; i++) {
    22             for (int j = 1; j < dp[0].length; j++) {
    23                 dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1))
    24                         || (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
    25             }
    26         }
    27 
    28         return dp[s1.length()][s2.length()];
    29     }
    30 }

    LeetCode 题目总结

  • 相关阅读:
    12864多级菜单实现,可方便实现无限级菜单(转)
    一起来学习PID
    STM32探秘 之FSMC
    RAD Studio (Delphi) Firemonkey 教程
    POS终端MAC算法-C语言实现
    STM32的PWM输入模式设置并用DMA接收数据
    AVR web server
    Linux 查看服务状态(服务与进程)
    linux设置开机自启动
    科目三靠边停车难度升级,超过50cm不合格怎么破?
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12894728.html
Copyright © 2011-2022 走看看