zoukankan      html  css  js  c++  java
  • Leetcode-Interleaving String

    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.

    Analysis:

    Initially, we consider the state d[k,i,j] as whether the first k chars in s3 is the interleaving string of the first i chars of s1 and the first j chars of s2. We then have the formula:

    d[k,i,j] = d[k-1][i-1][j] && s3[k]==s1[i]  || d[k-1][i][j-1] && s3[k]==s2[j].

    We then find that since a state d[k,i,j] has meaning only when k==(i+j), we actaully can reduce the number of states. We further use the state d[i,j] to present whether the s1[0-(i-1)] and s2[0-(j-1)] can interleave to s3[0-(i+j-1)]. we have formula:

    d[i][j] = d[i-1][j] && s3[i+j-1]==s1[i-1]    ||   d[i][j-1] && s3[i+j-1]==s2[j-1].

    Solution:

     1 public class Solution {
     2     public boolean isInterleave(String s1, String s2, String s3) {
     3         int len1 = s1.length();
     4         int len2 = s2.length();
     5         
     6         //NOTE: need to consider this boundary case!
     7         if (s3.length()!=len1+len2) return false;
     8         
     9         boolean[][] d = new boolean[len1+1][len2+1];
    10         d[0][0]=true;
    11         for (int i=1;i<=len2;i++)
    12             if (d[0][i-1] && s2.charAt(i-1)==s3.charAt(i-1))
    13                 d[0][i]=true;
    14             else d[0][i]=false;
    15 
    16         for (int i=1;i<=len1;i++)
    17             if (d[i-1][0] && s1.charAt(i-1)==s3.charAt(i-1))
    18                 d[i][0]=true;
    19             else d[i][0]=false;
    20 
    21         for (int i=1;i<=len1;i++)
    22             for (int j=1;j<=len2;j++)
    23                 if (d[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1))
    24                     d[i][j]=true;
    25                 else if (d[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1))
    26                     d[i][j]=true;
    27                 else d[i][j]=false;
    28 
    29 
    30         return d[len1][len2];        
    31     }
    32 }
  • 相关阅读:
    A标签几种状况下的样式问题
    接口Comparator和Comparable的区别和联系
    Hash算法的讲解
    我所理解的面向对象
    MySQL中select * for update锁表的范围
    Java中使用同步关键字synchronized需要注意的问题
    大数据量下高并发同步的讲解(不看,保证你后悔)
    Apache、Tomcat、JBoss、Weblogic四个常用的JavaEE服务器
    ibatis基本内容简介
    Java常见排序算法之归并排序
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4117856.html
Copyright © 2011-2022 走看看