大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的是字符串的处理和动态规划(DP)算法。
题目解答方法的文字分析
我们需要判断字符串 s3 是否可以由字符串 s1 和 s2 交错组成,同时保持每头牛的相对顺序不变。
这是一个典型的动态规划问题。我们可以使用动态规划来解决这个问题。首先,我们定义一个二维的 DP 数组 dp,其中 dp[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能够交错组成 s3 的前 i+j 个字符。
接下来,我们来考虑动态规划的转移方程。我们可以根据 s1 的第 i 个字符、s2 的第 j 个字符以及 s3 的第 i+j 个字符来判断是否能够交错组成。如果 s1 的第 i 个字符等于 s3 的第 i+j 个字符,并且 dp[i-1][j] 为 true,则说明 s1 的前 i 个字符和 s2 的前 j 个字符能够交错组成 s3 的前 i+j 个字符,即 dp[i][j] = true。同理,如果 s2 的第 j 个字符等于 s3 的第 i+j 个字符,并且 dp[i][j-1] 为 true,则说明 s1 的前 i 个字符和 s2 的前 j 个字符能够交错组成 s3 的前 i+j 个字符,即 dp[i][j] = true。
最后,我们需要初始化 DP 数组的边界条件。当 s1 和 s2 都为空时,s3 也必须为空才能交错组成,即 dp[0][0] = true。当 s1 为空时,我们只需要判断 s2 和 s3 的字符是否一一对应即可;当 s2 为空时,我们只需要判断 s1 和 s3 的字符是否一一对应即可。
本题解析所用的编程语言
C++
完整且正确的编程代码
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s1 string字符串 * @param s2 string字符串 * @param s3 string字符串 * @return bool布尔型 */ bool isInterleave(string s1, string s2, string s3) { int n1 = s1.length(); int n2 = s2.length(); int n3 = s3.length(); // 长度不符合条件,直接返回 false if (n1 + n2 != n3) { return false; } // 定义二维 DP 数组 vector<vector<bool>> dp(n1 + 1, vector<bool>(n2 + 1, false)); // 初始化边界条件 dp[0][0] = true; // 处理边界条件 for (int i = 1; i <= n1; ++i) { dp[i][0] = (dp[i - 1][0] && s1[i - 1] == s3[i - 1]); } for (int j = 1; j <= n2; ++j) { dp[0][j] = (dp[0][j - 1] && s2[j - 1] == s3[j - 1]); } // 动态规划递推 for (int i = 1; i <= n1; ++i) { for (int j = 1; j <= n2; ++j) { dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) || (dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]); } } return dp[n1][n2]; } };