本题初想不算难,只能按照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); }