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

题目:

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

示例 1:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true

示例 2:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false

简单介绍:
题目:交错字符串
题目难度:困难
使用语言:JAVA。
这道题来自leetcode题库的动态规划标签。

解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.两个字符串按顺序、交错的出现另一个字符串上
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,

数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.采用二维数组的方式来保存遍历的路径是否可达

算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.第一步,初始化工作。
2.第二步,判断新字符串长度与前两个字符串之和是否相等(不能省略)。
3.第三步,判断起点到终点的路径是否可达。

代码部分:


public class Solution {
     
    public boolean isInterleave(String s1, String s2, String s3) {
     
        int m=s1.length(),n=s2.length();
        boolean dp[][]=new boolean[m+1][n+1];

        if(s3.length()!=m+n) return false;

        dp[0][0]=true;

		//判断是否可达
        for(int i=1;i<=m&&s1.charAt(i-1)==s3.charAt(i-1);i++) dp[i][0]=true;
        for(int j=1;j<=n&&s2.charAt(j-1)==s3.charAt(j-1);j++) dp[0][j]=true;

        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++){
     
                dp[i][j]=(dp[i-1][j]&&s1.charAt(i-1)==s3.charAt(i+j-1)||dp[i][j-1]&&s2.charAt(j-1)==s3.charAt(i+j-1));
            }


        return dp[m][n];
    }
}


LeetCode解析------97.交错字符串-动态规划_第1张图片

结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

你可能感兴趣的:(leetcode,编程算法,数据结构,字符串,算法,java,leetcode)