leetcode : Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.
很明显的动态规划,以dp[i][j]表示s1取前i个字母,s2取前j个字母时,s3的前i + j个字母能否由s1,s2组成,
有状态转移公式:
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[current - 1]) || (dp[i][j - 1] && s2[j - 1] == s3[current - 1]);
AC代码:
class Solution { public: bool isInterleave(string s1, string s2, string s3) { if(!s1.size()) return s2 == s3; if(!s2.size()) return s1 == s3; if(s1.size() + s2.size() != s3.size()) return false; vector<vector<bool>> dp(s1.size() + 1, vector<bool>(s2.size() + 1, false)); for(int i = 1; i <= s1.size(); ++i) if(s1[i - 1] == s3[i - 1]) dp[i][0] = true; else break; for(int i = 1; i <= s2.size(); ++i) if(s2[i - 1] == s3[i - 1]) dp[0][i] = true; else break; for(int current = 2; current <= s3.size(); ++current){ for(int i = 1; i <= s1.size(); ++i){ for(int j = 1; j <= s2.size(); ++j){ if(i + j == current){ dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[current - 1]) || (dp[i][j - 1] && s2[j - 1] == s3[current - 1]); } } } } return dp[s1.size()][s2.size()]; } };
浙公网安备 33010602011771号