本文共 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); }} 解释:
通过这种方法,可以准确地找到两个基因序列相同位置的数量,并计算总基因长度。
转载地址:http://pkjs.baihongyu.com/