题解 | #交错编号# Java
交错编号
https://www.nowcoder.com/practice/07f674168c784a84a264cf487396daed
可以使用动态规划的方法进行求解。
定义一个二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符是否可以交错组成字符串s3的前i+j个字符。
首先,我们需要初始化dp数组的边界条件。当s1和s2都为空串时,也就是i=0且j=0时,dp[0][0]为true。当s1为空串时,也就是i=0且j≥1时,dp[0][j]等于s2的前j个字符是否与s3的前j个字符相等。同理,当s2为空串时,也就是i≥1且j=0时,dp[i][0]等于s1的前i个字符是否与s3的前i个字符相等。
然后,我们可以通过递推关系式来更新dp数组的其他位置。对于dp[i][j],如果s1的第i个字符等于s3的第i+j个字符,说明s1的第i个字符可以和s3的第i+j个字符匹配,此时可以继续判断s1的前i-1个字符和s2的前j个字符是否可以交错组成s3的前i+j-1个字符,即dp[i][j] = dp[i-1][j]。同理,如果s2的第j个字符等于s3的第i+j个字符,说明s2的第j个字符可以和s3的第i+j个字符匹配,此时可以继续判断s1的前i个字符和s2的前j-1个字符是否可以交错组成s3的前i+j-1个字符,即dp[i][j] = dp[i][j-1]。
最后,遍历完整个dp数组后,判断dp[s1.length()][s2.length()]的值即可,如果为true,则说明s3可以由s1和s2交错组成,否则不可以。
import java.util.*; public class Solution { public boolean isInterleave(String s1, String s2, String s3) { int m = s1.length(); int n = s2.length(); int k = s3.length(); if (m + n != k) { return false; } boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; for (int i = 1; i <= m; i++) { if (s1.charAt(i - 1) != s3.charAt(i - 1)) { break; } dp[i][0] = true; } for (int j = 1; j <= n; j++) { if (s2.charAt(j - 1) != s3.charAt(j - 1)) { break; } dp[0][j] = true; } for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if ((s1.charAt(i - 1) == s3.charAt(i + j - 1) && dp[i - 1][j]) || (s2.charAt(j - 1) == s3.charAt(i + j - 1) && dp[i][j - 1])) { dp[i][j] = true; } } } return dp[m][n]; } }
数组、链表、栈、队列、堆、树、图等。 查找和排序:二分查找、线性查找、快速排序、归并排序、堆排序等。 动态规划:背包问题、最长公共子序列、最短路径 贪心算法:活动选择、霍夫曼编码 图:深度优先搜索、广度优先搜索、拓扑排序、最短路径算法(如 Dijkstra、Floyd-Warshall) 字符串操作:KMP 算法、正则表达式匹配 回溯算法:八皇后问题、0-1 背包问题 分治算法:归并排序、快速排序