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.
动规题。用A[i1][i2]表示s1中的前i1个元素和s2中前i2个元素能否构成s3的前i1+i3个元素。
A[i1][i2] = (A[i1 - 1][i2] && s1[i1] == s3[i1+i2]) || (A[i1][i2 - 1] && s2[i2] == s3[i1+i2])
1 class Solution { 2 public: 3 int **mark; 4 bool isInterleave(string s1, string s2, string s3) { 5 // Start typing your C/C++ solution below 6 // DO NOT write int main() function 7 if(s1.length() + s2.length() != s3.length()) 8 return false; 9 if(s1.length() == 0 && s2.length() == 0) 10 return true; 11 if(s1.length() == 0) 12 return s2 == s3; 13 if(s2.length() == 0) 14 return s1 == s3; 15 mark = new int*[s1.length()+1]; 16 for(int i = 0;i<s1.length()+1;i++) 17 { 18 mark[i] = new int[s2.length()+1]; 19 for(int j = 0;j < s2.length()+1;j++) 20 mark[i][j] = -1; 21 } 22 return check(&s1, &s2, &s3,0,0,0); 23 } 24 bool check(string *s1, string *s2, string *s3,int i1,int i2,int i3) 25 { 26 bool tag1; 27 if(mark[i1][i2] != -1) 28 { 29 return bool(mark[i1][i2]); 30 } 31 if(i3 == s3->length()) 32 { 33 mark[i1][i2] = 1; 34 return true; 35 } 36 if(i1 < s1->length()) 37 { 38 if(s3->at(i3) == s1->at(i1)) 39 { 40 tag1 = check(s1,s2,s3,i1+1,i2,i3+1); 41 if(tag1 == true) 42 { 43 mark[i1][i2] = 1; 44 return true; 45 } 46 } 47 } 48 if(i2 < s2->length()) 49 { 50 if(s3->at(i3) == s2->at(i2)) 51 { 52 tag1 = check(s1,s2,s3,i1,i2+1,i3+1); 53 if(tag1 == true) 54 { 55 mark[i1][i2] = 1; 56 return true; 57 } 58 } 59 } 60 mark[i1][i2] = 0; 61 return false; 62 } 63 };

浙公网安备 33010602011771号