环状DNA序列的最小表示法

server/2024/11/27 10:00:31/

问题描述

环状 DNA 又称超螺旋,即一段碱基序列呈现环状,在分析时,需要将相同序列的环状 DNA 分到相同组内,现需将环状碱基序列按照最小表示法进行排序。

一段长度为 n 的碱基序列,按照顺时针方向,碱基序列可以从任意位置起开始该序列顺序,因此长度为 n 的碱基序列有 n 种表示法。例如:长度为 6 的碱基序列 CGAGTC,有 CGAGTCGAGTCCAGTCCG 等表示法。在这些表示法中,字典序最小的称为“最小表示”。

输入一个长度为 nn <= 100)的环状碱基序列(只包含 ACGT 这 4 种碱基)的一种表示法,输出该环状碱基序列的最小表示。

例如:
ATCA 的最小表示是 AATC
CGAGTC 的最小表示是 AGTCCG

输入描述

一段 DNA 碱基序列

输出描述

DNA 碱基序列的最小表示

备注
n <= 100
DNA 由大写英文字母 AGCT 组成

示例 1
输入:ATCA
输出:AATC

示例 2
输入:CGAGTC
输出:AGTCCG

解题思路

  1. 理解环状序列

    • 环状序列可以看作是一个长度为 n 的字符串,可以从任意位置开始。
    • 例如,序列 ATCA 可以有以下表示:ATCATCAACAATAATC
  2. 生成所有可能的表示

    • 对于一个长度为 n 的序列,可以生成 n 种不同的表示。
    • 具体来说,对于序列 s,我们可以通过将 s 循环移位来生成所有可能的表示。
  3. 比较字典序

    • 生成所有可能的表示后,我们需要比较这些表示的字典序,找到最小的那个。
  4. 优化比较

    • 直接生成所有表示并比较可能会导致不必要的计算。我们可以通过一些技巧来优化这个过程,例如使用双指针或滑动窗口来比较字符串。

算法步骤

  1. 初始化最小表示

    • 将输入序列的第一个表示作为初始的最小表示。
  2. 循环比较

    • 从第二个位置开始,生成新的表示,并与当前最小表示进行比较。
    • 如果新的表示比当前最小表示小,则更新最小表示。
  3. 返回结果

    • 最终得到的最小表示即为所求。

数据结构选择

  • 使用字符串来存储和比较序列。
  • 使用循环移位来生成所有可能的表示。

代码实现

#include <iostream>
#include <string>
#include <algorithm>std::string solution(std::string dna_sequence) {int n = dna_sequence.length();std::string min_representation = dna_sequence;// 生成所有可能的表示并比较for (int i = 1; i < n; ++i) {// 生成新的表示std::string new_representation = dna_sequence.substr(i) + dna_sequence.substr(0, i);// 比较新的表示与当前最小表示if (new_representation < min_representation) {min_representation = new_representation;}}return min_representation;
}int main() {// 你可以添加更多测试用例std::cout << (solution("ATCA") == "AATC") << std::endl;std::cout << (solution("CGAGTC") == "AGTCCG") << std::endl;std::cout << (solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG") << std::endl;return 0;
}

关键步骤解释

  1. 初始化最小表示

    • std::string min_representation = dna_sequence;
    • 将输入序列的第一个表示作为初始的最小表示。
  2. 生成所有可能的表示并比较

    • for (int i = 1; i < n; ++i):从第二个位置开始循环。
    • std::string new_representation = dna_sequence.substr(i) + dna_sequence.substr(0, i);:生成新的表示。
    • if (new_representation < min_representation):比较新的表示与当前最小表示。
    • min_representation = new_representation;:如果新的表示更小,则更新最小表示。
  3. 返回结果

    • return min_representation;:返回最终的最小表示。

http://www.ppmy.cn/server/145307.html

相关文章

代码随想录算法训练营第十三天(递归遍历;迭代遍历;统一迭代;层序遍历)

递归遍历 LeetCode 144. 二叉树的前序遍历 题目链接&#xff1a;二叉树的前序遍历题目链接 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) …

基于Java Springboot餐饮美食分享平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0 …

Django 路由层

1. 路由基础概念 URLconf (URL 配置)&#xff1a;Django 的路由系统是基于 urls.py 文件定义的。路径匹配&#xff1a;通过模式匹配 URL&#xff0c;并将请求传递给对应的视图处理函数。命名路由&#xff1a;每个路由可以定义一个名称&#xff0c;用于反向解析。 2. 基本路由配…

Python人工智能项目报告

一、实践概述 1、实践计划和目的 在现代社会&#xff0c;计算机技术已成为支撑社会发展的核心力量&#xff0c;渗透到生活的各个领域&#xff0c;应关注人类福祉&#xff0c;确保自己的工作成果能够造福社会&#xff0c;同时维护安全、健康的自然环境&#xff0c;设计出具有包…

计算机网络习题解答--个人笔记(未完)

本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续) 第二章&#xff1a; cookie&#xff1a;&#xff08;这里是比较老版本的HTTP&#xff0c;具体HTTPs是怎么实现的不是很清楚&#xff09;cookie的原理其实很简单。就是在HTTP消息头上又多…

spring boot有那些优势?

Spring Boot 作为 Spring 框架的一个扩展&#xff0c;旨在简化新 Spring 应用程序的初始搭建以及开发过程。它通过提供一系列默认配置来快速启动基于 Spring 的应用&#xff0c;并且减少了大量的样板代码和配置工作。以下是使用 Spring Boot 的一些主要优势&#xff1a; 简化配…

文件上传代码分析

目录 不同类型的语言脚本语⾔/解释型语⾔⼀次编译到处运⾏编译型语⾔ 不同语⾔的webshell上传差异脚本语⾔/解释型语⾔⼀次编译到处运⾏编译型语⾔ ⽂件上传到webshell任意⽂件上传js检测解析规则MIME⽂件头后缀检测失效 NTFS Tricks 不同类型的语言 脚本语⾔/解释型语⾔ 代表…

Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)

14.1 命令请求的执行过程 一个命令请求从发送到获得回复的过程中&#xff0c;客户端和服务器都需要完成一系列操作。 14.1.1 发送命令请求 当用户在客户端中输入一个命令请求的时候&#xff0c;客户端会把这个命令请求转换为协议格式&#xff0c;然后通过连接到服务器的套接字…