最长公共子串

来源:互联网 发布:经纬度换算器软件 编辑:程序博客网 时间:2024/06/04 04:04

        最长公共子串问题与最长公共子序列不同,最长公共子串要求公共序列是连续分布在母串中,比如s1 = "abcdef" ,s2 = "acdebf", 则s1与s2的最长公共子序列长度为5,公共子序列为 "acdef",最长公共子串长度为3,公共串为 "cde"; 最长公共子序列可以用dp做,同样最长公共子串也可以用dp做。

       考虑两序列 A="GCGCAATG" ,  B="GCCCTAGCG",先构造(A[i], B[j]) 大小为m*n的矩阵C,其中m=length(A), n=length(B);A[i] == B[j]等价于C[i][j]=1; 否则C[i][j]为0;因为是求最长公共串长度,不妨对C做下变形,

即若有A[i] == B[j] ,则令C[i][j] = C[i-1][j-1] + 1,否则C[i][j]=0; 初始条件 C[0][j] ==(A[0]==B[j]?1:0);则可以构造出矩阵C

     

    ————图片来自 http://www.cnblogs.com/zhangchaoyang/articles/2012070.html


        容易知道,矩阵C的最大元素值即为最长公共子串的长度。我们可以再构造矩阵的过程中保存当前得到的最长公共子串的末尾字符及长度。

分析下复杂度,时间复杂度就是构造矩阵过程为O(m*n),空间复杂度O(m*n);

       空间还可以优化,因为我们是一行一行的构造,当前行的值仅依赖于上一行的值,因此可以用一滚动数组来代替二维矩阵,下面是C++的实现,程序中的两个序列不是字符串,而是数组,对于其他类型的序列只要稍微改下即可完全套入

      

pair<int,int> LCS(vector<int> &A,vector<int> &B){int m = A.size(), n = B.size();pair<int,int> res = make_pair(-1,0);int *comn = new int[n];fill_n(comn,n,0);//构造(A[i],B[j])的矩阵C,如果A[i]==B[j]则点C[i][j]=1,否则C[i][j]=0//lcs[i][j]表示C[i][j]所在的左上对角线上C[i][j]前连续1的长度//为节省空间用滚动数组for(int i=0;i<m;i++){ for(int j=n-1;j>=1;j--){ comn[j] = 0;  //lcs[i][j]=lcs[i-1][j-1] + (A[i]==B[j])if(A[i]==B[j]){comn[j]=comn[j-1]+1;if(res.second<comn[j]){ res.first = A[i]; res.second=comn[j];}}//cout<<"test:"<<comn[j]<<"  ";}comn[0] = (A[i]==B[0]?1:0);// cout<<"test:"<<comn[0]<<endl;if(res.second<comn[0]){ res.first = A[i]; res.second=1;}}return res;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 别人挖鱼塘占了我的山土怎么办 自己的鱼塘让别人强行占住了怎么办 公路扩路占地占了鱼塘怎么办? 玉米皮编垫子编好后玉米绳怎么办 入户门门框未预留纱窗位怎么办 门和墙有2cm缝隙怎么办 支座预埋钢板忘记埋了怎么办 做完线雕一边紧一边松怎么办 卖家把没发货的填写了单号怎么办 买的人民币白银亏了好多钱怎么办 带控制线的三相四线开关怎么办 覆膜除尘布袋风拉不动怎么办 家里装修把暖气管道打破了怎么办 冷水管与热水管接错了怎么办 磨砂皮的鞋子打湿变硬了怎么办 等离子淡化热处理层渗不够厚怎么办 寄快递快递公司把东西弄坏了怎么办 寄美国的快递客人拒绝清关怎么办 国际e邮宝几天没物流信息了怎么办 石家庄小学网上报名填错了怎么办 去医院看病不知道挂什么科怎么办 深水井深水泵埋了2米怎么办 请问我捡的手机不是我的指纹怎么办 宝宝把塑料子弹塞到了鼻子里怎么办 坐便池上面的小孔不出水怎么办 还没离职已经找好工作怎么办 因火车晚点而耽误下趟火车怎么办 在广州坐的士丢了东西怎么办 找兼职的话他要求交押金怎么办 08vip不给提现了怎么办 点击订阅号所收到内容字太大怎么办 我的小叶栀子花老是黄叶该怎么办? 联币金融倒闭了我投资的钱怎么办 新单位交养老保险不接收档案怎么办 高铁发车十小时没赶上怎么办 饿了么被阿里收购员工怎么办? 爱疯4s密码忘了怎么办 研究生论文盲审一直不出结果怎么办 查重报告有疑似剽窃观点怎么办 成绩考的不好怎么办读技校有用吗 孩子大学挂科太多家长应该怎么办