LeetCode _interleaving string

题目这里就不再粘了,最近一直在看动态规划,本想换个思路,结果,这道题拿出来,真巧,又是动态规划,受不了了。
最无语的是,我一点都没看出来应该用动态规划解,我的思路如下:
对于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])

你可能感兴趣的:(LeetCode)