Description
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.
Solution
用两个整型变量p1 p2维护s1 s2中已匹配字符的个数,每次尝试将s3中待匹配的字符与s1s2当前可匹配的字符相匹配,若匹配则更新p1 p2的值并加入队列的尾部,若s1+s2等于s3的长度则表明匹配成功,若队列耗尽也没匹配成功则返回失败。
这样问题就转化成了BFS,过程中会出现重复出现(一对p1 p2的值表征一个状态)相同的状态,就不必再往下搜索,否则会引起搜索超时。因此需要维护一个记录已访问状态数据结构,简单起见这里使用一个二维数组记录状态访问情况。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| struct state { unsigned p, p1, p2; }; class Solution { public: bool isInterleave(string s1, string s2, string s3) { if(s1.length() + s2.length() != s3.length()) return false; queue<state> Q; bool vis[1000][1000]; memset(vis, false, sizeof(vis)); state s = {0, 0, 0}; Q.push(s); while(!Q.empty()) { state s = Q.front(); Q.pop(); if(s.p == s3.length()) return true; state ns; if(s3[s.p] == s1[s.p1]) { ns.p = s.p + 1; ns.p1 = s.p1 + 1; ns.p2 = s.p2; if(vis[ns.p1][ns.p2] == false) { vis[ns.p1][ns.p2] = true; Q.push(ns); } } if(s3[s.p] == s2[s.p2]) { ns.p = s.p + 1; ns.p1 = s.p1; ns.p2 = s.p2 + 1; if(vis[ns.p1][ns.p2] == false) { vis[ns.p1][ns.p2] = true; Q.push(ns); } } } return false; } };
|