环状 DNA 序列的最小表示法

问题描述

小C正在研究一种环状的 DNA 结构,它由四种碱基ACGT构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n 的碱基序列可以有 n 种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的"最小表示"。

例如:碱基序列 ATCA 从不同位置读取可能的表示有 ATCA, TCAA, CAAT, AATC,其中 AATC 是字典序最小的表示。

测试样例

样例1:

输入:dna_sequence = "ATCA"

输出:'AATC'

样例2:

输入:dna_sequence = "CGAGTC"

输出:'AGTCCG'

样例3:

输入:dna_sequence = "TTGAC"

输出:'ACTTG'

方法一:枚举法

java 复制代码
public class Main {
    public static String solution(String dna_sequence) {
        // Please write your code here
        int A_num = 0;
        for(char ch : dna_sequence.toCharArray()){
            if(ch == 'A') A_num++;
        }
        if(A_num != 0){
            String res = dna_sequence;
            for(int i = 0;i < A_num;i++){
                int index = dna_sequence.indexOf('A');
                dna_sequence = dna_sequence.substring(index)+dna_sequence.substring(0,index);
                res = MinString(res,dna_sequence);
                if(dna_sequence.charAt(0) == 'A'){
                    dna_sequence = dna_sequence.substring(1) + 'A';
                }
            }
            return res;
        }
        int C_num = 0;
        for(char ch : dna_sequence.toCharArray()){
            if(ch == 'C') C_num++;
        }
        if(C_num != 0){
            String res = dna_sequence;
            for(int i = 0;i < C_num;i++){
                int index = dna_sequence.indexOf('C');
                dna_sequence = dna_sequence.substring(index)+dna_sequence.substring(0,index);
                res = MinString(res,dna_sequence);
                if(dna_sequence.charAt(0) == 'C'){
                    dna_sequence = dna_sequence.substring(1) + 'C';
                }
            }
            return res;
        }
        int G_num = 0;
        for(char ch : dna_sequence.toCharArray()){
            if(ch == 'G') G_num++;
        }
        if(G_num != 0){
            String res = dna_sequence;
            for(int i = 0;i < G_num;i++){
                int index = dna_sequence.indexOf('G');
                dna_sequence = dna_sequence.substring(index)+dna_sequence.substring(0,index);
                res = MinString(res,dna_sequence);
                if(dna_sequence.charAt(0) == 'G'){
                    dna_sequence = dna_sequence.substring(1) + 'G';
                }
            }
            return res;
        }
        return dna_sequence;
    }

    private static String MinString(String res, String dna_sequence) {
        if(res.equals(dna_sequence)) return res;
        for(int i = 0;i < res.length();i++){
            if(res.charAt(i) < dna_sequence.charAt(i)){
                return res;
            }
            if(res.charAt(i) > dna_sequence.charAt(i)){
                return dna_sequence;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution("ATCA").equals("AATC"));
        System.out.println(solution("CGAGTC").equals("AGTCCG"));
        System.out.println(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG").equals("AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG"));
    }
}
相关推荐
就叫_这个吧2 小时前
Java递归方法实现面包屑导航
java·开发语言
小O的算法实验室2 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
fīɡЙtīиɡ ℡2 小时前
AI 应用系统设计
java·开发语言·人工智能
小飞学编程...2 小时前
【哈希表】
数据结构·哈希算法·散列表
城管不管2 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅2 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒2 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
Tbisnic3 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
最强小杰3 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
Brilliantwxx3 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法