<Leetcode>Interleaving String

来源:互联网 发布:紫峰抢票软件 编辑:程序博客网 时间:2024/05/29 23:24

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.

链接:http://oj.leetcode.com/problems/interleaving-string/


        这道题曾经做过尝试,不过当时没有做出来,主要是没想对思路,最近稍微闲下来,看着不爽于是决定A掉。第一反应是搜索,看了下以前的提交发现有超时,想起来之前可能是用过搜索,后来貌似是卡在了dp的方式上,当时应该是对各字符记录下一次出现的位置设计的dp算法,并且后来证明该方法有没考虑到的问题,嗯,换句话说,那方法是错的。但这题肯定是用dp,只是要找到一种记录方式。

        这时候想到记录连续长度的方法,开3个数组先初始化,算出个字符在该位置及以后连续的长度,这样在计算推进的时候可以满足无后效性。于是开始码,算法总是边码边想到的。后来还是用的递归,把dp当做了剪枝手段,没想到一步到位的方法。分支主要产生在判断当三个字符串对应位置为同一个元素的时候,判错逻辑放在了递归之后以简化编程逻辑(开销不大,就是入递归栈频繁点),最后提交ok。


class Solution{public:bool Recur(int p1,int p2,int p3,string &s1, string &s2, string &s3){///////////////////////判断结束////////////////////////////if(p1==len1){int i=p2,j=p3;while(i<len2&&j<len3&&s2[i]==s3[j]){++i;++j;}if(i==len2&&j==len3)return true;return false;}else if(p2==len2){int i=p1,j=p3;while(i<len1&&j<len3&&s1[i]==s3[j]){++i;++j;}if(i==len1&&j==len3)return true;return false;}////////////////////////判断错误情况/////////////////////////////////////if(s3[p3]!=s1[p1]&&s3[p3]!=s2[p2])return false;if(s1[p1]==s3[p3]){if(s2[p2]!=s3[p3]){return Recur(p1+charConsecutive3[p3],p2,p3+charConsecutive3[p3],s1,s2,s3);}else{int j,i= charConsecutive1[p1]<charConsecutive3[p3]?charConsecutive1[p1]:charConsecutive3[p3];while(i>=0){j=charConsecutive3[p3]-i;if(j>charConsecutive2[p2])return false;if(Recur(p1+i,p2+j,p3+charConsecutive3[p3],s1,s2,s3))return true;--i;}}}else{return Recur(p1,p2+charConsecutive3[p3],p3+charConsecutive3[p3],s1,s2,s3);}}bool isInterleave(string s1, string s2, string s3){int i,pos1,pos2;len1=s1.length();len2=s2.length();len3=s3.length();if(len1 + len2!= len3)return false;//////////////////////////////////init////////////////////////if(len1>0)charConsecutive1[len1-1]=1;if(len2>0)charConsecutive2[len2-1]=1;if(len3>0)charConsecutive3[len3-1]=1;for(i=len1-2;i>=0;i--)charConsecutive1[i] = s1[i]==s1[i+1]?charConsecutive1[i+1]+1:1;for(i=len2-2;i>=0;i--)charConsecutive2[i] = s2[i]==s2[i+1]?charConsecutive2[i+1]+1:1;for(i=len3-2;i>=0;i--)charConsecutive3[i] = s3[i]==s3[i+1]?charConsecutive3[i+1]+1:1;/////////////////////////////////////////////////return Recur(0,0,0,s1,s2,s3);}int len1,len2,len3;int charConsecutive1[200];int charConsecutive2[200];int charConsecutive3[400];};


原创粉丝点击