Circular Sequence UVA - 1584

Circular Sequence UVA - 1584

题目传送:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4459

题目大意:一个环状DNA链,只有ACTG,那么问题来了,一个环状串,我从哪里读都行,比如ACTG,CTGA,TGAC,都可以,问,从哪里读是字典序最小的呢?

分析:一开始我以为是直接排序,因为题目描述太长了,看看例子就直接敲了,果然错,因为你不能改变他的环状序列顺序,ACTG 不能变成ACGT,虽然后者字典序更小,但却改变了顺序,所以直接sort,不行;

这个时候我们可以暴力循环查找,反正串也不长;

AC Code:

#include<iostream>  
#include<cstdio>  
#include<cstring>  
using namespace std;  
char str[105];  
bool findmin(int n,int m)//查看以谁为新的字符串起点字典序最小  
{  
    int len=strlen(str);  
    for(int i=0;i<len;i++)  //通过对长度的取余来实现环状串的搭建
        if(str[(n+i)%len]!=str[(m+i)%len])  
            return str[(n+i)%len]<str[(m+i)%len];  
    return false;//相等的情况  
}  
int main()  
{  
    int t;  
    cin>>t;  
    while(t--)  
    {  
        cin>>str;  
        int minn=0,len=strlen(str);  
        for(int i=0;i<len;i++)//访问字符串的每一位,挨个作为序列的起始位置;
            if(findmin(i,minn)) minn=i;//更新为大字典序的位置; 
            for(int i=0;i<len;i++)  
                printf("%c",str[(i+minn)%len]);  
            printf("\n");  
    }  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值