ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 0097 Interleaving String

2022-05-06 08:01:34  阅读:171  来源: 互联网

标签:charAt s3 s2 Interleaving 元素 复杂度 0097 LeetCode s1


原题传送门

1. 题目描述

2. Solution 1

1、思路分析
动态规划: 设len(s1)=n,len(s2)=m。
1> 状态定义: f(i, j) 表示s1的前i个元素和s2的前j个元素是否能交错组成s3的前i+j个元素。
2> 边界: f(0, 0)=true
3> 状态转移方程:
如果s1的第i个 元素和s3的第i+j个元素相等,那么s1的前i个元素和s2的前j个元素是否能交错成s3的前i+j个元素取决于s1的前i-1个元素和s2的前j个元素是否能交错组成s3的前i+j-1个元素,即此时f(i, j)取决于f(i-1, j),在此情况下如果f(i - 1, j)为真,则f(i, j)也为真。同样的,如果s2的第j个元素和s3的第i+j个元素相等并且f(i, j-1)为真,则f(i, j)也为真。综上:
f(i, j) = (f(i-1, j) and s1(i-1) = s3(p)) or (f(i, j-1) and s2(j-1) = s3(p)),其中p=i+j-1。

2、代码实现

package Q0099.Q0097InterleavingString;


/*
    动态规划: 设len(s1)=n,len(s2)=m。
    1> 状态定义: f(i, j) 表示s1的前i个元素和s2的前j个元素是否能交错组成s3的前i+j个元素。
    2> 边界: f(0, 0)=true
    3> 状态转移方程:
    如果s1的第i个 元素和s3的第i+j个元素相等,那么s1的前i个元素和s2的前j个元素是否能交错成s3的前i+j个元素取决于s1的前i-1个元素和s2的前j个
    元素是否能交错组成s3的前i+j-1个元素,即此时f(i, j)取决于f(i-1, j),在此情况下如果f(i - 1, j)为真,则f(i, j)也为真。同样的,如果
    s2的第j个元素和s3的第i+j个元素相等并且f(i, j-1)为真,则f(i, j)也为真。综上:
    f(i, j) = (f(i-1, j) and s1(i-1) = s3(p)) or (f(i, j-1) and s2(j-1) = s3(p)),其中p=i+j-1。
 */
public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int n = s1.length(), m = s2.length(), t = s3.length();

        if (n + m != t) return false;

        boolean[][] f = new boolean[n + 1][m + 1];

        f[0][0] = true;
        for (int i = 0; i <= n; ++i) {
            for (int j = 0; j <= m; ++j) {
                int p = i + j - 1;
                if (i > 0) {
                    f[i][j] = f[i][j] || (f[i - 1][j] && s1.charAt(i - 1) == s3.charAt(p));
                }
                if (j > 0) {
                    f[i][j] = f[i][j] || (f[i][j - 1] && s2.charAt(j - 1) == s3.charAt(p));
                }
            }
        }
        return f[n][m];
    }
}

3、复杂度分析
时间复杂度: O(nm)
空间复杂度: O(nm)

3. Solution 2

1、思路分析
使用滚动数组优化空间复杂度。因为这里数组f的第i行只和第i-1行相关,所以我们可以用滚动数组优化这个动态规划,这样空间复杂度可以变成O(m)。

2、代码实现

package Q0099.Q0097InterleavingString;

public class Solution2 {
    public boolean isInterleave(String s1, String s2, String s3) {
        int n = s1.length(), m = s2.length(), t = s3.length();

        if (n + m != t) return false;

        boolean[] f = new boolean[m + 1];
        f[0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                int p = i + j - 1;
                if (i > 0)
                    f[j] = f[j] && s1.charAt(i - 1) == s3.charAt(p);
                if (j > 0)
                    f[j] = f[j] || (f[j - 1] && s2.charAt(j - 1) == s3.charAt(p));
            }
        }
        return f[m];
    }
}

3、复杂度分析
时间复杂度: O(nm)
空间复杂度: O(m)

标签:charAt,s3,s2,Interleaving,元素,复杂度,0097,LeetCode,s1
来源: https://www.cnblogs.com/junstat/p/16227197.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有