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状态找的不好。
本方法:
S(i,j) = 1
if (s1[i+1] == s3[i+j+1]) S(i+1,j) = 1
if (s2[j+1] == s3[i+j+1]) S(i,j+1) = 1
如有好的方法,请告诉我啊!!
#include <queue>
#include <utility>
using namespace std;
class Solution {
public:
bool m[100][100];
bool isInterleave(string s1, string s2, string s3) {
memset(m, 0, sizeof(m));
if (s1.size() + s2.size() != s3.size()) return false;
queue<pair<int,int> > q;
q.push(make_pair(0,0));
int i1, i2, t;
while (!q.empty()) {
i1 = q.front().first;
i2 = q.front().second;
q.pop();
t = i1 + i2;
if (t == s3.size()) return true;
if (i1 < s1.size() && s3[t] == s1[i1]) {
if (!m[i1+1][i2]){
m[i1+1][i2] = true;
q.push(make_pair(i1+1, i2));
}
}
if (i2 < s2.size() && s3[t] == s2[i2]) {
if (!m[i1][i2+1]) {
m[i1][i2+1] = true;
q.push(make_pair(i1, i2+1));
}
}
}
return false;
}
};
做完后,发现之前做过。
dp[i][j] = true, 表示s1[0~i]和s2[0~j]可以搞成s3[i+j]
dp[i][j] =
1. true: dp[i-1][j] = true && s1[i] == s3[i+j]
2. true: dp[i][j-1] = true && s2[j] == s3[i+j]
3. false: else
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int l1 = s1.size(), l2 = s2.size(), l3 = s3.size();
if (l3 != l1 + l2) return false;
bool dp[l1+1][l2+1];
memset(dp, 0, sizeof(dp));
dp[0][0] = true;
for (int len = 1; len <= l3; len++) {
for (int i = 0; i <= len && i <= l1; i++) {
int j = len - i;
if (j > l2) continue;
dp[i][j] = false;
if (i > 0 && dp[i-1][j] && s1[i-1] == s3[len-1]) dp[i][j] = true;
if (j > 0 && dp[i][j-1] && s2[j-1] == s3[len-1]) dp[i][j] = true;
}
}
return dp[l1][l2];
}
};