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;
}