博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lintcode--005(最长公共子序列)
阅读量:6800 次
发布时间:2019-06-26

本文共 1819 字,大约阅读时间需要 6 分钟。

Given two strings, find the longest common subsequence (LCS).     最长公共子序列

Your code should return the length of LCS.

 

Clarification

What's the definition of Longest Common Subsequence?

Example

For "ABCD" and "EDCA", the LCS is "A" (or "D", "C"), return 1.

For "ABCD" and "EACB", the LCS is "AC", return 2.

应用: 在生物工程中,比较两个DNA串的相似性。

 

解题:

1. 首先,必须弄清楚什么是子序列,什么是最长公共子序列;

2. 容易想的方法就是暴力求解,穷举所有子序列,然后找到最大的,然而这种指数级别的复杂度肯定不合适。

3. 所以我们需要分析问题,刻画公共子序列所具有的特征;

假设: 有两个字符串 A = “ABCDUHNEK” ;  B = ”KFACEKLO“  ;求解他两的最大公共子序列;

首先:两个字符串的长度设为: m=A.length(), n=B.length();

我们考虑两个字符串的最后一个字符A[m-1] 和 B[n-1] 。

(1)假如相等:两个字符串的最长公共子序列就一定包含最后一个字符,而且它的长度应该等价于字符串 A‘ = “ABCDUHNE” 与 B’ = ”KFACEKL“ 的最大公共子序列的长度+1

(2)假如不相等:两个字符串的最长公共子序列就有两种情况:等价于,A = “ABCDUHNEK” 与  B‘ = ”KFACEKL“ 的最大公子序列长度 或者

                                                                                                                    A‘ = “ABCDUHNE” 与  B = ”KFACEKLO“ 的最大公共子序列长度。

有此特点可以得到这个问题的递归解公式:

其中c[i,j]定义为一个二维数组,用于存储两个字符串最长公共子序列的长度。下标i,j表示字符串A中的前i-1个字符和 字符串B中的前 j-1个字符所具有的最长公共子串(注意:数组计数从0开始)。

递归求解,可得类似下表:

X字符串:ABCBDAB

Y字符串:BDCABA

算法时间复杂度为:Θ(m + n)。

 

实现代码如下:

class Solution {public:    /**     * @param A, B: Two strings.     * @return: The length of longest common subsequence of A and B.     */    int longestCommonSubsequence(string A, string B) {        // write your code here                //最大公共子序列,方法在算法导论中有专门讲解。当学完之后来看,题目很简单。        //编程习惯要好!  注意括号对称,循环嵌套缩进!!!        int a=A.size();//两个字符串的长度        int b=B.size();        int num; //最大公共子序列长度        int c[a+1][b+1];//定义二维数组,用来存放最大公共子序列的长度,注意定义和引用时下标的区别;        for(int i=0;i
=c[i+1][j]){ c[i+1][j+1]=c[i][j+1]; } else{ c[i+1][j+1]=c[i+1][j]; } } } } num=c[a][b]; return num; }};

 

附:当需要返回最长公共子序列时,只需要在上面所考虑的三中情况下都设置相应的标记位就能实现了。表格中所画的三种箭头,在实际实现时可以用0,1,-1三个标志位来表示。

 

 

转载地址:http://ofywl.baihongyu.com/

你可能感兴趣的文章
扒一扒我们生活中常见的品牌小程序
查看>>
使用注解干掉大量if else和switch
查看>>
【本人秃顶程序员】实战并发-使用分布式缓存和有限状态机
查看>>
[MySQL光速入门]019 分别使用loop, while, repeat 来计算 从0加到100 答案
查看>>
浅析libuv源码-node事件轮询解析(2)
查看>>
区块链软件公司:区块链技术去中心化
查看>>
Python爬虫的基本概念、分类、学习路线以及爬取数据思路
查看>>
BCH或许才是真正的未来
查看>>
python编程:从入门到实践学习笔记-函数
查看>>
SpringBoot使用Nacos配置中心
查看>>
Java四种线程池的使用
查看>>
Go学习系列——第一个 Go程序
查看>>
关于ntp时间同步理论及配置参数-20170804
查看>>
loadrunner 脚本开发-int型变量和字符串的相互转换
查看>>
为什么运行NOVA命令总要报一个DEBUG,没找到原因,路过的大侠一起看看啊
查看>>
北电ERS1600,8300,8600交换机的基本技术-第十章接口高级特征
查看>>
我的友情链接
查看>>
20170830L08-06老男孩linux实战运维培训-Lamp系列之-Apache服务生产实战应用指南03
查看>>
我的友情链接
查看>>
今天面试IBM CSDL
查看>>