leetcode Interleaving String

来源:互联网 发布:重装系统提示网络电缆 编辑:程序博客网 时间:2024/06/14 17:32
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.

给定两个数组 s1 s2 还有第三个数组s3 问用s1 s2 能否组成s3 利用一个二维数组m[i][j]存储 s1[0..i-1] s2[0..j-1]是否能构成s3[0..i+j-1]
m[i][j]=true 当且仅当 m[i][j-1]&&s2[j-1]==s3[len-1] 或者m[i-1][j]&&s1[i-1]==s3[len-1] len=i+j
class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        int ss1=s1.size();        int ss2=s2.size();        int ss3=s3.size();        if(ss1==0)return s2==s3;        if(ss2==0)return s1==s3;        if(ss3!=ss1+ss2)return false;        bool m[ss1+1][ss2+1];        memset(m,false,(ss1+1)*(ss2+1));        m[0][0]=true;        for(int i=0;i<ss1&&i<ss3;i++){        if(s1[i]==s3[i]){        m[i+1][0]=true;}else{break;}}for(int i=0;i<ss2&&i<ss3;i++){        if(s2[i]==s3[i]){        m[0][i+1]=true;}else{break;}}bool valid=false;for(int len=2;len<=ss3;len++){valid=false;if(len<=ss1&&m[len][0]||len<=ss2&&m[0][len]){valid=true;}//len:1~ss3//len:ss1+ss2 ss1:[0 ss1] s1[ss1-1]int minlen=max(1,len-ss2);for(int i=minlen;i<len&&i<=ss1;i++){int j=len-i;if(j>=ss2)if(m[i][j-1]&&s2[j-1]==s3[len-1]){valid=true;m[i][j]=true;//有一条通路可以到达m[i][j]即可continue;}if(m[i-1][j]&&s1[i-1]==s3[len-1]){valid=true;m[i][j]=true;continue;}}if(!valid){return false;}}return true;    }};


0 0