LeetCode 刷题【97. 交错字符串】
97. 交错字符串
自己做
解:递归(超时)
class Solution {
public:bool matchStr(string &s1, int i, string &s2, int j, string &s3, int z){while(i < s1.size() && j < s2.size() && z < s3.size() && s1[i] != s2[j]){ //不相等的情况下if(s3[z] == s1[i] || s3[z] == s2[j]){if(s3[z] == s1[i])i++;if(s3[z] == s2[j])j++;z++;}else //不匹配return false;}if(i < s1.size() && j < s2.size() && z < s3.size() && s1[i] == s2[j] && s3[z] == s1[i]){ //相等的情况下if(matchStr(s1, i + 1, s2, j, s3, z + 1)) //匹配第一个return true;if(matchStr(s1, i, s2, j + 1, s3, z + 1)) //匹配第二个return true;return false; //都匹配不上}while(i < s1.size()) //第一个字符串没有匹配完if(s1[i] == s3[z]){i++;z++;}elsereturn false;while(j < s2.size()) //第二个字符串没有匹配完if(s2[j] == s3[z]){j++;z++;}elsereturn false;if(i == s1.size() && j == s2.size() && z == s3.size())return true;return false;}bool isInterleave(string s1, string s2, string s3) {if(s1.size() + s2.size() > s3.size())return false;return matchStr(s1, 0, s2, 0, s3, 0);}
};
看题解
官方题解:
动态规划
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {auto f = vector < vector <int> > (s1.size() + 1, vector <int> (s2.size() + 1, false));int n = s1.size(), m = s2.size(), t = s3.size();if (n + m != t) {return false;}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[i - 1] == s3[p]);}if (j > 0) {f[i][j] |= (f[i][j - 1] && s2[j - 1] == s3[p]);}}}return f[n][m];}
};
优化自己的代码
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {if(s1.size() + s2.size() != s3.size()) //必然不匹配return false;vector<vector<bool>> DP(s1.size() + 1, vector<bool>(s2.size() + 1, false));DP[0][0] = true;for(int i = 1; i <= s1.size(); i++) //s2不选(为空)的情况if(s1[i - 1] == s3[i - 1])DP[i][0] = DP[i - 1][0];elsebreak;for(int j = 1; j <= s2.size(); j++) //s1不选(为空)的情况if(s2[j - 1] == s3[j - 1])DP[0][j] = DP[0][j - 1];elsebreak; for(int i = 1; i <= s1.size(); i++)for(int j = 1; j <= s2.size(); j++){DP[i][j] = DP[i][j - 1] && s2[j - 1] == s3[i + j - 1] || DP[i - 1][j] && s1[i - 1] == s3[i + j - 1];}return DP[s1.size()][s2.size()];}
};
官方最终优化版(省内存)
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {auto f = vector <int> (s2.size() + 1, false);int n = s1.size(), m = s2.size(), t = s3.size();if (n + m != t) {return false;}f[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[j] &= (s1[i - 1] == s3[p]);}if (j > 0) {f[j] |= (f[j - 1] && s2[j - 1] == s3[p]);}}}return f[m];}
};