lintcode-交叉字符串

本题初想不算难,只能按照s1和s2字符串的顺序去挨个比较字符串s3,本能就会想到递归算法,利用递归去减少代码量,但是这里有一个隐藏点,当比较到的位置s1和s2字符相同,且都与s3的相同,此时就应该分两种情况,即让s1该字符与s3上进行比配,然后往后比较,或者  让s2该字符与s3上进行匹配,然后往后比较。

匹配过程中若存在s1和s2位置上字符都不能和s3上字符匹配,则匹配失败,s3不是s1和s2的交叉字符,当三个匹配位置同时到达自己字符串的尾部时,匹配成功。

bool check(string& s1, string& s2, string& s3,
               int idx1, int idx2, int idx3){
                   if(s1[idx1] != s3[idx3] && s2[idx2]!=s3[idx3])   //s3和s2 s1都不能匹配,失败
                        return false;
                   if(idx1==s1.length() && idx2==s2.length() && idx3==s3.length())  //都能够达到字符串末尾,匹配成功
                        return true;
                   if(s1[idx1] == s3[idx3] && s2[idx2]==s3[idx3])  //都能匹配上,就要考虑两种情况
                        return check(s1,s2,s3,idx1+1, idx2, idx3+1) || check(s1,s2,s3, idx1, idx2+1, idx3+1);
                   if(s1[idx1] == s3[idx3]) 
                        return check(s1,s2,s3,idx1+1, idx2, idx3+1);
                   if(s2[idx2]==s3[idx3])
                        return check(s1,s2,s3, idx1, idx2+1, idx3+1);
    
    }
    bool isInterleave(string &s1, string &s2, string &s3) {
        // write your code here
         if(s1.length() + s2.length() != s3.length())
            return false;
        return check(s1,s2,s3,0,0,0);
    }

猜你喜欢

转载自blog.csdn.net/ddou_pan/article/details/79678582
今日推荐