题解 | #交错编号# java
交错编号
https://www.nowcoder.com/practice/07f674168c784a84a264cf487396daed
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) { int n = s1.length(); int m = s2.length(); int 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) { // 如果s1的前i-1个字符和s2的前j个字符能够交错组成s3的前p个字符, // 并且s1的第i个字符等于s3的第p个字符,则s1的前i个字符和s2的前j个字符能够交错组成s3的前p+1个字符 f[i][j] = f[i][j] || (f[i - 1][j] && s1.charAt(i - 1) == s3.charAt(p)); } if (j > 0) { // 如果s1的前i个字符和s2的前j-1个字符能够交错组成s3的前p个字符, // 并且s2的第j个字符等于s3的第p个字符,则s1的前i个字符和s2的前j个字符能够交错组成s3的前p+1个字符 f[i][j] = f[i][j] || (f[i][j - 1] && s2.charAt(j - 1) == s3.charAt(p)); } } } return f[n][m]; } }
该代码使用的编程语言是Java。
代码考察的知识点包括动态规划和字符串操作。
代码的文字解释大纲如下:
- 代码的目标:判断字符串s3是否由字符串s1和s2交错组成。
- 输入参数:s1、s2和s3分别表示三个字符串。
- 返回值:布尔型,表示s3是否由s1和s2交错组成。
- 首先,获取字符串s1、s2和s3的长度n、m和t。
- 如果s1和s2的长度之和不等于s3的长度t,则返回false,因为无法满足交错组成的条件。
- 创建一个二维布尔数组f,大小为(n+1)×(m+1),用于记录子问题的结果。
- 初始化f[0][0]为true,表示空字符串可以由空字符串组成。
- 使用两层循环遍历所有可能的交错组合情况。
- 在每个位置(i, j)上,计算当前交错组合是否成立。
- 假设当前位置对应的s3的索引为p = i + j - 1。
- 如果i大于0,表示s1还有字符可供选择,那么需要判断s1的第i个字符是否与s3的第p个字符相等,同时前一个位置也能够形成交错组合,即f[i-1][j]为true。
- 如果j大于0,表示s2还有字符可供选择,那么需要判断s2的第j个字符是否与s3的第p个字符相等,同时前一个位置也能够形成交错组合,即f[i][j-1]为true。
- 将以上两个情况的结果求逻辑或,并赋值给f[i][j],表示当前位置是否能够形成交错组合。
- 循环结束后,返回f[n][m]的值作为最终结果,表示整个字符串s3是否能够由s1和s2交错组成。