基因序列

基因序列可以由A,G,C,U四个字母组成的序列表示,某科学家想通过向给定的基因序列中
插入字母使得序列前后对称来进行研究
你的任务是:
给定一个基因序列,计算一下要插入多少个字母才能使得序列前后对称。
输入一行,表示带插入的基因序列(长度不大于1000)
要求输出一个正整数,表示至少要插入多少个字母。

package the_blue_cup;
//密码脱落
import java.util.Scanner;

public class Demo_12 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String characterString = sc.nextLine();
		
		System.out.println(findCode(characterString));
		
	}
	//该方法返回最少字母缺失个数
	public static int findCode(String string) {
		char[] characterList = string.toCharArray();//将字符串转化为数组
		//初始化计数
		int count = 0;
		//分别从两头往中间寻找相同字母,并计数
		int leftCount, rightCount;
		从两边开始遍历,
		for (int i = 0, j = characterList.length - 1; i < j;) {//迭代后操作写在循环内部
			//若对应值相等
			if (characterList[i] == characterList[j]) {
				i++;
				j--;
				continue;//跳出本次循环
			}else {
				//若对应值不相等
				leftCount = 0;//左侧计数初始化为0
				int leftCursor = i;//创建一个指针变量从该索引处往右寻找
				
				while(characterList[leftCursor] != characterList[j]) {
					leftCursor++;//不相等指针向前移动
					leftCount++;//并计数
				}
				//类似
				rightCount = 0;
				int rightCursor = j;
				while(characterList[rightCursor] != characterList[i]) {
					rightCursor--;//向左侧移动
					rightCount++;//并计数
				}
				//将最短路径赋给对应变量
				if (leftCount > rightCount) {
					j -= rightCount;
				}else {
					i += leftCount;
				}
				//计算最短路径
				count += (leftCount < rightCount) ? leftCount : rightCount;
			}
		}
			
		return count;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着大量的基因组DNA序列数据被获得,它对了解基因越来越重要(基因组DNA的一部分,是负责合成蛋白质的)。总所周知,在基因序列中,由于存在垃圾的DNA中断基因的编码区,真核生物(相对于原核生物)的基因链更加复杂。也就是说,一个基因被分成几个编码片段(称为外显子)。虽然在蛋白质的合成过程中,外显子的顺序是固定的,但是外显子的数量和长度可以是任意的。 大多数基因识别算法分为两步:第一步,寻找可能的外显子;第二步,通过寻找一条拥有尽可能多的外显子的基因链,尽可能大地拼接一个基因。这条链必须遵循外显子出现在基因序列中的顺序。外显子i在外显子j的前面的条件是i的末尾必须在j开头的前面。 本题目的目标是,给定一组可能的外显子,找出一条拥有尽可能多的外显子链,拼接成一个基因。 输入: 给出几组输入实例。每个实例的开头是基因序列中可能的外显子数n(0<n<1000).接着的n行,每行一对整数,表示外显子在基因序列中的起始和结束位置。假设基因序列最长为50000.当一行是0时,表示输入结束。 输出: 对于每个实例,找出最可能多的外显子链,输出链中的外显子,并占一行。假如有多条链,但外显子数相同,那么输出其中任意一条。 输入样列: 6 340 500 220 470 100 300 880 943 525 556 612 776 3 705 773 124 337 453 665 0 输出样列: 3 1 5 6 4 2 3 1 提示:可以用贪心或动归来做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值