题目这里就不再粘了,最近一直在看动态规划,本想换个思路,结果,这道题拿出来,真巧,又是动态规划,受不了了。
最无语的是,我一点都没看出来应该用动态规划解,我的思路如下:
对于s1,s2两个字符串,分别使用,pos1和pos2记录当前扫描位置,同时使用pos记录当前s3扫描位置,此时存在如下情况:
if s1[pos1]==s3[pos3] then pos1++; pos3++;
if s2[pos2]==s3[pos3] then pos2++; pos3++;
当以上两种情况都满足的时候,任选其中的一种,
都不满足时,返回false结束;
当s3扫描完毕时,返回true结束,我的代码如下
#include <string>
using namespace std;
class Solution{
public:
bool isInterleave(string s1,string s2,string s3){
int len1=s1.size();
int len2=s2.size();
int len3=s3.size();
//judge length
if(len1+len2!=len3){
return false;
}
//judge interleave
int pos1=0;
int pos2=0;
int pos3=0;
while(true){
if(pos1==len1||pos2==len2||pos3==len3){
break;
}
if(s1[pos1]==s3[pos3]){
pos1++; pos3++;
}
else{
if(s2[pos2]==s3[pos3]){
pos2++; pos3++;
}
else{
return false;
}
}
}
while(pos1!=len1){
if(s1[pos1]==s3[pos3]){
pos1++; pos3++;
}
else{
return false;
}
}
while(pos2==len2){
if(s2[pos2]!=s3[pos3]){
pos2++; pos3++;
}
else{
return false;
}
}
return true;
}
};
int main(){
Solution ss;
ss.isInterleave("a","","a");
return 0;
}
结果,果断贡献WA,错误用例:
“aa” "ab" "aaba"
最后看了别人的代码,
Thoughts of computer since ,可恶的动态规划:
class Solution {
private:
bool f[1000][1000];
public:
bool isInterleave(string s1, string s2, string s3) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (s1.size() + s2.size() != s3.size())
return false;
f[0][0] = true;
for(int i = 1; i <= s1.size(); i++)
f[i][0] = f[i-1][0] && (s3[i-1] == s1[i-1]);
for(int j = 1; j <= s2.size(); j++)
f[0][j] = f[0][j-1] && (s3[j-1] == s2[j-1]);
for(int i = 1; i <= s1.size(); i++)
for(int j = 1; j <= s2.size(); j++)
f[i][j] = (f[i][j-1] && s2[j-1] == s3[i+j-1]) || (f[i-1][j] && s1[i-1] == s3[i+j-1]);
return f[s1.size()][s2.size()];
}
};
看了代码恍然大悟,按照之前自己的思路,其实主要错在最后一点,也就是说当两if个条件都满足的时候,interleave string 当前扫描位置的字串是不可以随意分配的,也就是说分配给任意一个s1和s2的情况都要考虑,这样就清楚了,对于当前s1[1..i]和s2[1..j]和s3[1..k]当前是否满足交叉条件取决于一下两个条件:
(f[i][j-1] && s2[j-1] == s3[i+j-1]) || (f[i-1][j] && s1[i-1] == s3[i+j-1])