蓝桥杯:蓝肽子序列(Java)

文章描述了一种基于蛋蓝质的研究问题,其中涉及到了如何分析两个蓝肽序列的相似性。通过识别大写字母标记的蓝肽,并找到它们的共同子序列,可以确定最长的公共部分。给出的解题思路包括了字符串处理和列表操作,最终计算出最长公共蓝肽子序列的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

L 星球上的生物由蛋蓝质组成,每一种蛋蓝质由一类称为蓝肽的物资首尾
连接成一条长链后折叠而成。
生物学家小乔正在研究 L 星球上的蛋蓝质。她拿到两个蛋蓝质的蓝肽序列,
想通过这两条蓝肽序列的共同特点来分析两种蛋蓝质的相似性。
具体的,一个蓝肽可以使用 1 5 个英文字母表示,其中第一个字母大写,
后面的字母小写。一个蛋蓝质的蓝肽序列可以用蓝肽的表示顺序拼接而成。
在一条蓝肽序列中,如果选取其中的一些位置,把这些位置的蓝肽取出,
并按照它们在原序列中的位置摆放,则称为这条蓝肽的一个子序列。蓝肽的子
序列不一定在原序列中是连续的,中间可能间隔着一些未被取出的蓝肽。
如果第一条蓝肽序列可以取出一个子序列与第二条蓝肽序列中取出的某个
子序列相等,则称为一个公共蓝肽子序列。
给定两条蓝肽序列,找出他们最长的那个公共蓝肽子序列的长度。

【输入格式】

输入两行,每行包含一个字符串,表示一个蓝肽序列。字符串中间没有空
格等分隔字符。

【输出格式】

输出一个整数,表示最长的那个公共蓝肽子序列的长度。

【样例输入】

LanQiaoBei
LanTaiXiaoQiao

【解题思路】

         ① 读题我们可以知道,每隔1-5个字母就会有可能出现一个大写字母,我们可以根据这点的特征把这种看起来具有相关性的规律,来把他们一个个划分出来,然后再进行比较

        ②准备两个list,存储的类型都为StringBuffer

         ③准备两个布尔类型的数组,用来标识出现大写字母的位置

        ④将输入分别将输入进来的两个字符串转化成为char类型的数组

        ⑤ 在for循环中,先声明一个StringBuffer类型的变量,然后执行do-while循环(目的是把大写字母加入进去,然后i++,如果i自增后已经到达length的长度时,就退出循环,以免越界访问数组元素。随后退出do-while循环,并把当前的这个StringBuffer变量加入到list中,然后再接着执行for循环。寻找下一个相似类型的字串。

        ⑥两个list一一进行遍历(小范围再外面,大范围再里面)

【完整代码】

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main{

    public static void main(String[] args) {

        List<StringBuffer> list1 = new ArrayList<>();
        List<StringBuffer> list2 = new ArrayList<>();
        int count = 0;
        Scanner sc1 = new Scanner(System.in);
        String str1 = sc1.nextLine();
        char[] chars1 = str1.toCharArray();
        Scanner sc2 = new Scanner(System.in);
        String str2 = sc2.nextLine();
        char[] chars2 = str2.toCharArray();

        boolean[] a1 = new boolean[chars1.length];
        boolean[] a2 = new boolean[chars2.length];

        for (int i = 0; i < a1.length ; i++) {
            if (chars1[i] >= 97) a1[i] = true;
        }

        for (int i = 0; i < a2.length ; i++) {
            if (chars2[i] >= 97) a2[i] = true;
        }


        for (int i = 0; i < chars1.length;) {
            StringBuffer sb = new StringBuffer();
              do{
                  sb.append(chars1[i]);
                  i++;
                  if (i == chars1.length) break;
              }while (a1[i]);
             list1.add(sb);
        }

        for (int i = 0; i < chars2.length;) {
            StringBuffer sb = new StringBuffer();
            do{
                sb.append(chars2[i]);
                i++;
                if (i == chars2.length) break;
            }while (a2[i]);
            list2.add(sb);
        }

        for (int i = 0; i < list1.size(); i++) {
            for (int j = 0; j < list2.size() ; j++) {
                if (list1.get(i).toString().equals(list2.get(j).toString())) count++;
            }

        }


        System.out.println(count);

        }

}

【结果展示】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucas-Lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值