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.
//方案一,递归,超时。复杂度o(n+m)
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
//base condition
if(s1.empty() && s2.empty() && s3.empty()){
return true;
}
else if(s1.empty() || s2.empty() || s3.empty()){
return false;
}
else{
bool state;
if(s3[0] == s1[0]){
state = isInterleave(s1.substr(1, -1), s2, s3.substr(1, -1));
if(state == true){
return true;
}
}
if(s3[0] == s2[0]){
state = isInterleave(s1, s2.substr(1, -1), s3.substr(1, -1));
if(state == true){
return true;
}
}
return false;
}
}
};
将递归改成了循环,依旧超时。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
stack<size_t> st1;
stack<size_t> st2;
stack<size_t> st3;
size_t i = 0;
size_t j = 0;
size_t k = 0;
while(i < s1.size() && j < s2.size() && k < s3.size()){
if(s3[k] == s1[i] && s3[k] == s2[j]){
//move s2 and s3 then push the state into stack
st1.push(i);
st2.push(j + 1);
st3.push(k + 1);
}
if(s3[k] == s1[i]){
k++;
i++;
}
else if(s3[k] == s2[j]){
k++;
j++;
}
else if(st1.empty() == false){
i = st1.top();
j = st2.top();
k = st3.top();
st1.pop();
st2.pop();
st3.pop();
}
else{
return false;
}
}
return true;
}
};
参考了这篇博客http://my.oschina.net/zuoyc/blog/347676,当递归超时时,应该考虑动态规划。
//dp[i][j]表示用s1的前i个字符和s2的前j个字符能否interleave组成s3的前j+i个字符。
//dp[i][j] = (dp[i-1][j] && s1[i - 1] == s3[i + j - 1]) ||(dp[i][j-1] && s2[j - 1] == s3[i + j - 1])
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if(s1.size() + s2.size() != s3.size()) return false;
bool dp[s1.size() + 1][s2.size() + 1];
memset(dp, false, sizeof(bool) * (s1.size() + 1) * (s2.size() + 1));
dp[0][0] = true;
for(size_t i = 1; i < s1.size() + 1; i++){
if(s1[i - 1] == s3[i - 1]){
dp[i][0] = true;
}
else{
break;
}
}
for(size_t j = 1; j < s2.size() + 1; j++){
if(s2[j - 1] == s3[j - 1]){
dp[0][j] = true;
}
else{
break;
}
}
for(size_t i = 1; i < s1.size() + 1; i++){
for(size_t j = 1; j < s2.size() + 1; j++){
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) || (dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]);
}
}
return dp[s1.size()][s2.size()];
}
};
