CoderJesse  
wangjiexi@CS.PKU

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 };

 

posted on 2013-03-01 13:48  CoderJesse  阅读(135)  评论(0)    收藏  举报