环状序列

环状序列问题描述
长度为n的环状串有n种表示法,分别为某个位置开始顺时针得到。CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称为“最小表示”。输入一个长度为n(n<=100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。
样例输入:

2
CGAGTCAGCT
CTCC

样例输出:

AGCTCGAGTC
CCCT

描述了很多,其实就是一个字典排序,想想我们的英语字典,apple是不是排在bat前面的?主要就是a比b小,另外apple是不是排在append后面的,因为e比l小。

要时刻铭记他是在这个环中选取最小的,不要脱离环想当然
感觉跟循环队列的那个%很相似
在这里插入图片描述

代码实现

#include<iostream>
#include<string.h>
#define maxn 105 
using namespace std;
int a[maxn];
int lesss(const char*s,int p,int q){
	int n=strlen(s);
	for(int i=0;i<n;i++){
		if(s[(p+i)%n]!=s[(q+i)%n])//p代表下一个,q代表原来的那个
		return s[(p+i)%n]<s[(q+i)%n];//如果从下一个开始更小,则返回
		return 0;//否则返回零。针对main函数里的if
	}
}

int main() {
	int T,n;
	char s[maxn];
	scanf("%d",&T);
	while(T--){
		scanf("%s",s);
		int ans=0;//默认数组位置0中的最小
		int n=strlen(s);
		for(int i=1;i<n;i++)
		if(lesss(s,i,ans))ans=i;//这个函数是为了于环状串中下一个字母进行比较。
		//所以for循环时从1开始
		for(int i=0;i<n;i++)
		putchar(s[(i+ans)%n]);
		putchar('\n');
	} 

return 0;
}

 

在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页