博客
关于我
【Lintcode】1900. Gene Similarity
阅读量:198 次
发布时间:2019-02-28

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

题目地址:

给定两个基因序列 g 1 g_1 g1 g 2 g_2 g2,判断有多少位置的基因相同,并且求总共基因数量是多少。基因序列的格式是,首先是一个数字,然后后面跟一个字母('A', 'C', 'G', 'T'其中一个),然后重复这个数字字母模式。数字代表后面跟的这个字母重复多少次。例如对于"2T3G"这个基因序列,它实际上是指的"TTGGG"。题目保证两个基因序列扩充完之后长度相等。

思路是将数字字母这个模式看成一个区间,这样一个基因序列就能看成若干个小区间了,这样两个基因序列的比较,实际上就是比较两个区间序列。而两个区间的比较,例如两个区间分别是 I 1 I_1 I1 I 2 I_2 I2,则先看两个区间长度哪个大,例如如果长度 l 1 < l 2 l_1<l_2 l1<l2,那么比较完之后 I 1 I_1 I1的剩余比较长度就是 0 0 0了,而 I 2 I_2 I2的剩余比较长度是 l 2 − l 1 l_2-l_1 l2l1,这里剩余比较长度是接下来还可以参与比较的长度。如果两个区间的基因相同,则计数加上 l 1 l_1 l1,意味找到了长 l 1 l_1 l1的公共部分,否则计数不变。 I 1 I_1 I1被比较掉了之后,就截取 g 1 g_1 g1接下来的区间再和 I 2 I_2 I2比,这样循环以此类推,直到两个基因序列都被全比较掉为止。代码如下:

public class Solution {           class Gene {           char ch;        int len;                public Gene(char ch, int len) {               this.ch = ch;            this.len = len;        }    }        /**     * @param Gene1: a string     * @param Gene2: a string     * @return: return the similarity of two gene fragments     */    public String GeneSimilarity(String Gene1, String Gene2) {           // write your code here        // count记录相同基因个数,totalLen记录基因序列总长度,idx1记录Gene1的下一个比较区间的起点,idx2类似        int count = 0, totalLen = 0, idx1 = 0, idx2 = 0;        Gene g1 = new Gene(' ', 0), g2 = new Gene(' ', 0);                // 只有当两个基因序列全被比较完才推出循环        while (idx1 < Gene1.length() || idx2 < Gene2.length()) {           	// 当第一个基因序列的当前区间被比较掉的时候,截出下一个区间            if (g1.len == 0) {               	// 先截出数字部分                int i1 = idx1;                while (i1 < Gene1.length() && Character.isDigit(Gene1.charAt(i1))) {                       i1++;                }                                // 得到相同基因的区间                g1 = new Gene(Gene1.charAt(i1), Integer.parseInt(Gene1.substring(idx1, i1)));                // 记一下该区间长度                totalLen += g1.len;                // 将idx1移到下一个区间截取的起点                idx1 = i1 + 1;            }                        // 对第二个基因序列做类似的事情,但totalLen不用再计数了            if (g2.len == 0) {                   int i2 = idx2;                while (i2 < Gene2.length() && Character.isDigit(Gene2.charAt(i2))) {                       i2++;                }                                g2 = new Gene(Gene2.charAt(i2), Integer.parseInt(Gene2.substring(idx2, i2)));                idx2 = i2 + 1;            }                        // 求一下g1区间和g2区间可以提供多少个相同位置的相同基因,并同时更新g1和g2            count += getCount(g1, g2);        }                return count + "/" + totalLen;    }        private int getCount(Gene g1, Gene g2) {           int l1 = g1.len, l2 = g2.len;        g1.len = Math.max(l1 - l2, 0);        g2.len = Math.max(l2 - l1, 0);                return g1.ch == g2.ch ? Math.min(l1, l2) : 0;    }}

时空复杂度 O ( max ⁡ { l g 1 , l g 2 } ) O(\max\{l_{g_1},l_{g_2}\}) O(max{

lg1,lg2})

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

你可能感兴趣的文章
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>