- 困难
- 中等
- 简单
题目描述
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。来源,leetcode 每日一题 97. 交错字符串

示例:
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出:true输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出:false输入:s1 = "", s2 = "", s3 = ""输出:true
解题思路
- S3是有S1和S2组成,那么思路就可以如下:
- s3的前k个字符,可否由s1的前i个字符和s2的前j个字符交错而成?
- 使用动态规划:由于这里涉及到了s1和s2,那么就需要用二维数组,每个纬度分别表示s1或者s2,则动态转移方程为:
- result[i][j] = result[i-1][j] if s1[i] == s3[k] 或者
- result[i][j] = result[i][j-1] if s2[j] == s3[k]
代码
class Solution {public:bool isInterleave(string s1, string s2, string s3) {if (s3.length() != s1.length() + s2.length()) {return false;} else if (s3.find(s1) != s3.npos && s3.find(s2) != s3.npos) {return true;}int length1 = s1.length();int length2 = s2.length();vector<vector<bool>> result(s1.length() + 1,vector<bool>(s2.length() + 1));result[0][0] = true;for (int i = 0; i <= length1; i++) {for (int j = 0; j <= length2; j++) {int p = i + j - 1;if (i > 0) {result[i][j] = (result[i-1][j] && s1[i-1] == s3[p]) | result[i][j];}if (j > 0) {result[i][j] = (result[i][j-1] && s2[j-1] == s3[p]) | result[i][j];}p++;}}return result[length1][length2];}};
总结
什么时候会需要用动态规划?
当问题可以按顺序进行解决的时候!
