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) {
// write code here
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) {
f[i][j] |= (f[i - 1][j] && s1.charAt(i - 1) == s3.charAt(p));
}
if (j > 0) {
f[i][j] |= (f[i][j - 1] && s2.charAt(j - 1) == s3.charAt(p));
}
}
}
return f[n][m];
}
}
编程语言是Java。
这道题考察的是动态规划。给
代码的思路是使用一个二维布尔数组f来记录状态,其中f[i][j]表示s1的前i个字符和s2的前j个字符能否交织形成s3的前i+j个字符。初始时,f[0][0]被置为true。
使用两个循环遍历所有可能的i和j的值,更新f[i][j]的值。对于当前位置(i, j),根据s3的第(i+j-1)个字符,我们有两种情况:
- 如果s1的第i个字符和s3的第(i+j-1)个字符相等,则f[i][j]的值可以通过将s1的前i-1个字符和s2的前j个字符进行交织得到,即f[i-1][j]。
- 如果s2的第j个字符和s3的第(i+j-1)个字符相等,则f[i][j]的值可以通过将s1的前i个字符和s2的前j-1个字符进行交织得到,即f[i][j-1]。
判断f[i][j]的值是否为true,如果是则继续进行下一个位置的计算。最后返回f[n][m],其中n是s1的长度,m是s2的长度。

汤臣倍健公司氛围 363人发布