题解 | #交错编号#

交错编号

https://www.nowcoder.com/practice/07f674168c784a84a264cf487396daed

知识点:动态规划

思路:

我们首先获取字符串s1的长度为n,字符串s2的长度为m,字符串s3的长度为N。如果s1s2的长度之和不等于s3的长度,则返回false

我们创建一个二维布尔数组f,其中f[i][j]表示字符串s3的前i个字符是否由字符串s1的前j个字符和字符串s2的前i-j个字符交错组成。

初始化f[0][0]true,表示空字符串可以由两个空字符串交错得到。

接下来,使用两重循环遍历字符串s3的每个字符,同时遍历字符串s1和字符串s2的前缀。

  • 如果s3的当前字符等于s1的当前字符且j > 0,则更新f[i][j]为上一个状态f[i-1][j-1]的值。
  • 如果s3的当前字符等于s2的当前字符且i - j > 0,则更新f[i][j]为上一个状态f[i-1][j]的值。

最终,返回f[N][n],即判断字符串s3是否由字符串s1s2交错组成的结果。

编程语言:java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s1 string字符串
     * @param s2 string字符串
     * @param s3 string字符串
     * @return bool布尔型
     */
    public boolean isInterleave (String s1, String s2, String s3) {
        // write code here
        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];
    }
}

全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务