LeetCode-97.交错字符串 动态规划

这里是题目描述:LeetCode-97.交错字符串

本题使用 动态规划 解法。

设给定的三个字符串s1s2s3的长度分别为l1l2l3,首先确定l1+l2==l3,若不相等,则s3肯定不能通过s1s2交错组成,直接返回false

l1+l2==l3,建立并维护一个二维动规表dp,长宽尺寸分别为l1+1l2+1dp[j][k]记录s1从开头到下标j-1的子串和s2从开头到下标k-1的子串能否交错组成s3从开头到下标i+j-1的子串。dp表的j=0k=0即首行首列处记录s1s2子串为空的情况

  • 首先将dp[0][0]设置为true,表示s1s2s3的子串均为空串时可以交错组成
  • i=1开始,表示s3的子串长度为1的情况,到i=l3,表示s3的子串是整个s3的情况,对于每个i值,循环填充对应的dp[j][k]。其中0=,确保不发生数组越界,k=i-jk<=l2,确保不发生数组越界。每个i值对应的dp填充轨迹如下图的蓝色虚线。
  • 对于每个dp[j][k],表示长度为is3子数组能否被长度分别为js1子数组和ks2子数组交错组成,其中i必定等于j+k。而dp[j][k]值的计算依赖于子数组s3[0:i)s1[0:j)s2[0:k)的末位字符相等与否和dp[j][k]的上边值和左边值,即dp[j-i][k]dp[j][k-1]。当s3[0:i)s1[0:j)末位字符相等,且s1[0:j-1)s2[0:k)可以交错组成s3[0:i-1)时,s3[0:i)就能被s1[0:j)s2[0:k)交错组成,即如果dp[j-1][k]=true,则dp[i][j]=true;同理可得出s3[0:i)s2[0:k)末位字符相等时,如果dp[j][k-1]=true,则dp[i][j]=true。这是dp的状态转移方程,如下图的红色箭头
  • 最后返回dp[l1][l2],即动规表最右下角的值,就是最终结果值
    LeetCode-97.交错字符串 动态规划_第1张图片
    状态转移方程:
dp[0][0]=true
dp[j][k]=(s1.char(j-1)==s3(k+j-1) && dp[j-1][k]) || (s2.char(k-1)==s3(k+j-1) && dp[j][k-1])       //!(j==0 && k==0) 注意数组越界问题

题解代码:

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int l1=s1.length(),l2=s2.length(),l3=s3.length();
        if((l1+l2)!=l3)
        {
            return false;
        }
        boolean[][] dp=new boolean[l1+1][l2+1];
        dp[0][0]=true; //s1和s2的子串都为空串时,可以组成s3的空子串
        for(int i=1;i<=l3;i++)
        {
            char ch=s3.charAt(i-1);
            for(int j=Math.min(i,l1);j>=0;j--)
            {
                int k=i-j;
                if(k>l2)
                {
                    break;
                }
                boolean temp=false;
                if(j-1>=0 && s1.charAt(j-1)==ch)
                {

                    temp=temp || dp[j-1][k];
                }
                if(k-1>=0 && s2.charAt(k-1)==ch)
                {
                    temp=temp || dp[j][k-1];
                }
                dp[j][k]=temp;
            }
        }
        return dp[l1][l2];
    }
}

时间复杂度:O(mn),m和n分别是s1s2的长度
空间复杂度:O(mn)

你可能感兴趣的:(字符串,数据结构,动态规划,算法,java)