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

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

基因序列的解析与比较是解决本题的关键步骤。以下是详细的解析过程:

  • 基因序列解析:每个基因序列由数字和字母组成,数字表示后续重复的字母次数。例如,"2T3G" 解析为 "TTGGG"。解析过程需要识别每个数字和后续的字母,生成区间表示。

  • 区间比较:将每个基因序列分解为多个区间,每个区间由字符和长度组成。比较两个区间的长度,逐个字符进行比较,统计相同位置的数量。

  • 相同位置统计:比较两个区间的字符,如果相同,则增加计数,缩短较长区间的长度,继续比较剩余部分,直到所有区间都被处理完。

  • 通过上述步骤,可以准确地找出两个基因序列相同的位置数量,并计算总基因长度。

    以下是代码的优化版本:

    public class Solution {    class Gene {        char ch;        int len;        public Gene(char ch, int len) {            this.ch = ch;            this.len = len;        }    }    public String GeneSimilarity(String Gene1, String Gene2) {        int count = 0;        int totalLen1 = 0;        int totalLen2 = 0;        int idx1 = 0;        int idx2 = 0;        Gene currentG1 = new Gene(' ', 0);        Gene currentG2 = new Gene(' ', 0);        while (idx1 < Gene1.length() || idx2 < Gene2.length()) {            if (currentG1.len == 0) {                // 解析Gene1的下一个区间                int i1 = idx1;                while (i1 < Gene1.length() && Character.isDigit(Gene1.charAt(i1))) {                    i1++;                }                if (i1 > idx1) {                    char c1 = Gene1.charAt(i1);                    int len1 = Integer.parseInt(Gene1.substring(idx1, i1));                    currentG1 = new Gene(c1, len1);                    totalLen1 += len1;                    idx1 = i1 + 1;                } else {                    // 无法解析下一个区间,结束循环                    break;                }            }            if (currentG2.len == 0) {                // 解析Gene2的下一个区间                int i2 = idx2;                while (i2 < Gene2.length() && Character.isDigit(Gene2.charAt(i2))) {                    i2++;                }                if (i2 > idx2) {                    char c2 = Gene2.charAt(i2);                    int len2 = Integer.parseInt(Gene2.substring(idx2, i2));                    currentG2 = new Gene(c2, len2);                    totalLen2 += len2;                    idx2 = i2 + 1;                } else {                    // 无法解析下一个区间,结束循环                    break;                }            }            // 比较当前区间            int minLen1 = Math.min(currentG1.len, currentG2.len);            if (currentG1.ch == currentG2.ch) {                count += minLen1;                // 更新当前区间长度                currentG1.len -= minLen1;                currentG2.len -= minLen1;            } else {                // 字符不同,不增加计数            }            // 检查是否有任何区间剩余            if (currentG1.len > 0 || currentG2.len > 0) {                // 进入下一个循环会自动处理            } else {                // 两个区间都处理完毕,退出循环                break;            }        }        return count + "/" + (totalLen1 + totalLen2);    }}

    解释

  • Gene类:用于存储当前区间的字符和长度。
  • GeneSimilarity方法
    • 初始化变量,记录计数、总长度和当前比较位置。
    • 使用循环处理每个区间,直到两个基因序列都被比较完。
    • 解析基因序列,生成区间,并记录总长度。
    • 比较当前区间的字符和长度,更新计数和区间长度。
    • 继续处理下一个区间,直到所有区间处理完毕。
  • 通过这种方法,可以准确地找到两个基因序列相同位置的数量,并计算总基因长度。

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

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 实战 | 使用OpenCV确定对象的方向(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于OpenCV和K-Means聚类实现颜色分割(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
    查看>>
    OpenCV与AI深度学习 | 实用技巧 | 使用OpenCV进行模糊检测
    查看>>
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>
    OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 水下检测+扩散模型:或成明年CVPR最大惊喜!
    查看>>
    OpenCV与AI深度学习 | 深入浅出了解OCR识别票据原理
    查看>>