题解 | #交错编号#
交错编号
https://www.nowcoder.com/practice/07f674168c784a84a264cf487396daed
知识点:动态规划
思路:
我们首先获取字符串s1
的长度为n
,字符串s2
的长度为m
,字符串s3
的长度为N
。如果s1
和s2
的长度之和不等于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
是否由字符串s1
和s2
交错组成的结果。
编程语言: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]; } }