[2014暴风影音笔试]求最长公共字串

来源:互联网 发布:振动检测软件 编辑:程序博客网 时间:2024/05/12 02:53

给定字符串A和B,输出A和B的第一个最长公共字串。比如A="wepiabc", B="pabcni",则输出"pabc"。

#include <iostream>#include <stack>using namespace std;void LCS(char *s1, char *s2){if (s1==NULL || s2==NULL){return;}//compute string lengthint iLen1 = 0;int iLen2 = 0;char *p = s1;while (*p != '\0'){p++;iLen1++;}p = s2;while (*p != '\0'){p++;iLen2++;}if (iLen1<=0 || iLen2<=0){return;}//LCSint *pLen  = (int *)malloc((iLen1+1)*(iLen2+1)*sizeof(int));int *pPrev = (int *)malloc((iLen1)*(iLen2)*sizeof(int));memset(pLen, 0, (iLen1+1)*(iLen2+1)*sizeof(int));memset(pPrev, -1, (iLen1)*(iLen2)*sizeof(int));int nStrideLen = iLen2+1;int *pOrg = pLen+nStrideLen+1;//(1,1)for (int i=0; i<iLen1; ++i){for (int j=0; j<iLen2; ++j){if (s1[i]==s2[j]){pOrg[i*nStrideLen+j] = pOrg[(i-1)*nStrideLen+j-1]+1;pPrev[i*iLen2+j] = 0;//diagonal}else {int nN1 = pOrg[(i-1)*nStrideLen+j];//horizontalint nN2 = pOrg[(i)*nStrideLen+j-1];//verticalpOrg[i*nStrideLen+j] = (nN1>nN2? nN1:nN2);pPrev[i*iLen2+j] = (nN1>nN2? 1:2);}}}//print out LCSint i = iLen1-1;int j = iLen2-1;stack<char> s;pOrg = pLen+nStrideLen+1;while (i>=0 && j>=0){if (pPrev[i*iLen2+j]==0){s.push(s2[j]); j--;i--;}else {(pPrev[i*iLen2+j]==1)? i--:j--;}}while (!s.empty()){cout<<s.top();s.pop();}cout<<endl;free(pLen);free(pPrev);}int main(){char s2[] = "wepiabc";char s1[] = "pabcni";LCS(s1, s2);}


原创粉丝点击