[leetcode] Interleaving String@DP

来源:互联网 发布:echo linux 命令@echo 编辑:程序博客网 时间:2024/05/01 16:12

Given s1s2s3, 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.

首先说一下这个interleaving的意思,这个单词的意思就是s3是否能通过s1和s2交织得到,s1,s2中字符的相对顺序是不能被打乱的。

递归的解法如下:

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {// Start typing your C/C++ solution below// DO NOT write int main() function    return _isInterleave(s1,s2,s3);}bool _isInterleave(string s1,string s2,string s3){int length1=s1.size();int length2=s2.size();int length3=s3.size();if(length1+length2!=length3)return false;if(s3=="")return s1==""&&s2=="";if(s1=="" && s2=="")return s3=="";if(s1=="")return s2==s3;if(s2=="")return s1==s3;string s11(s1.begin()+1,s1.end());string s21(s2.begin()+1,s2.end());string s31(s3.begin()+1,s3.end());if(s1[0]==s3[0] && s2[0]!=s3[0])return _isInterleave(s11,s2,s31);else if(s1[0]!=s3[0] && s2[0]==s3[0])return _isInterleave(s1,s21,s31);else if(s1[0]==s3[0] && s2[0]==s2[0])return _isInterleave(s11,s2,s31)||_isInterleave(s1,s21,s31);elsereturn false;}};

非递归的解法如下:

class Solution {private:public:bool isInterleave(string s1, string s2, string s3) {// Start typing your C/C++ solution below// DO NOT write int main() functionint length1=s1.size();int length2=s2.size();int length3=s3.size();if (length1 + length2 != length3)return false;bool (*f)[1000]=new bool[s1.size()+1][1000];f[0][0] = true;for(int i = 1; i <= length1; i++)f[i][0] = f[i-1][0] && (s3[i-1] == s1[i-1]);for(int j = 1; j <= length2; j++)f[0][j] = f[0][j-1] && (s3[j-1] == s2[j-1]);for(int i = 1; i <= length1; i++)for(int j = 1; j <= length2; 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[length1][length2];}};


原创粉丝点击