交叉字符串
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
样例
比如 s1 = "aabcc" s2 = "dbbca"
- 当 s3 = "aadbbcbcac",返回 true.
- 当 s3 = "aadbbbaccc", 返回 false.
dp[i][j][k] 代表 当到了s3的第i位时,s1的到了第j位 s2到了第k位。 因为i是一直向前循环的 且 只用到i-1 所以可以省去第一维数组 又因为 i == k+j 所以可以省第三层循环 最终时间复杂度 空间复杂度都为 O(N^2)
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 class Solution { 6 public: 7 /* 8 * @param : A string 9 * @param : A string 10 * @param : A string 11 * @return: Determine whether s3 is formed by interleaving of s1 and s2 12 */ 13 int dp[210][210]; 14 bool isInterleave(string s1, string s2, string s3) { 15 // write your code here 16 if(s3.length() != s1.length() + s2.length()) return 0; 17 18 dp[0][0] = 1; 19 for(int i = 1; i <= s3.length(); ++i){ 20 for(int j = 0; j <= min(i, (int)s1.length()); ++j){ 21 int k = i - j; 22 23 if(j > 0 && s3[i-1] == s1[j-1]){ 24 dp[j][k] = dp[j][k] | dp[j-1][k]; 25 } 26 27 if(k > 0 && s3[i-1] == s2[k-1]){ 28 dp[j][k] = dp[j][k] | dp[j][k-1]; 29 } 30 31 } 32 } 33 return dp[s1.length()][s2.length()] == 1; 34 } 35 }; 36 37 int main(){ 38 string a , b ,c; 39 cin >> a >> b >> c; 40 Solution sol = Solution(); 41 bool ans = sol.isInterleave(a, b, c); 42 cout << ans << endl; 43 }