环状序列(逐行解析)(保姆式解析)(算法竞赛入门经典二)
创始人
2024-03-01 10:30:28

环状序列


在这里插入图片描述

长度为n的环状串有n种表示法,分别为某个位置开始顺时针得到。例如,图中的环状串有10种表示:
CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称为“最小表示”。

输入一个长度为n(n<=100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC.

输入:
在输入文件的第一行 为序列数量。每一个测试用例都需要一行包含一个循环序列,
这个序列被写成一个任意的线性序列。
由于循环序列是DNA串,只有四个符号:A,C,G,T。
每一序列的长度为n(2<=n<=100)。

输出:
每行为串的字典序最小的序列。下面的样例为2个串的序列。

样例输入:
2
CGAGTCAGCT
CTCC

样例输出:
AGCTCGAGTC
CCCT
在这里插入图片描述

在这里插入图片描述

#include
#include
#define maxn 100int less(const char* s, int p, int q)//见下注释2
{int n = strlen(s);for (int i = 0; i < n; i++){if (s[(p + i) % n] != s[(q + i) % n])//%n是为了将转了一圈后将那一圈减去,类似13:00就是1:00return s[(p + i) % n] < s[(q + i) % n];/*这里p是main里i, q是ans,一旦找到某个字符串i打
头比ans打头字典序更小,返回1,才会把i赋值给ans(见main())。注意是字典序最小,不是打头
元素最小,所以要用for循环,一个一个往下找,找到不一样的才return*/
。}return 0; //相等
}int main()
{int C;scanf("%d", &C);//输入要判断几个环状序列while (C--)//见下注释1{char s[maxn];//创立数组存储字符串scanf("%s", s);//输入要判断的序列int n = strlen(s);//计算该序列的长度int ans = 0;  // ans是指最小的那个开头的数,默认最小序列就是s[0]开头// 让默认序列与其他序列比较 for (int i = 1; i < n; i++)//见注释2if (less(s, i, ans))ans = i;// 输出最小序列for (int j = 0; j < n; j++){putchar(s[(ans + j) % n]);}putchar('\n');}return 0;
}

注释1
这里我曾经想了好久,不理解为什么会用循环,其实后来发现是我理解错了,这里我原来以为输入的是字符串长度,其实是用来判断多个环状序列的

注释2
这里就是整个判断的关键部分,由less这个函数可以直接判断出最小序列

首先我们从一个数进入,例如就是c

在这里插入图片描述

然后此时i=1,ans=0,接着进入less函数(注意此时i就是p,ans就是q)。进入第一次循环,此时就判断s[1]是否等于s[0]

在这里插入图片描述
这里很明显c

在这里插入图片描述

这时s[2]

在这里插入图片描述
很明显不成立,则ans值不改变,紧着向下进行

在这里插入图片描述
在这里插入图片描述
好接下来遇到第二个问题,如果开头相同怎么办?

在这里插入图片描述
此时ans=2,i=6,进入函数,结果s[2]==s[6],那么这时候for循环就发挥作用啦,比较第二个数,也就是s[3]和s[7]

在这里插入图片描述
结果发现还相等,就再for一次,比较s[4]和s[8]

在这里插入图片描述
这里就可以看出s[8]

那么到这其实思路就很清晰啦,%n就是为了让它的数不超过字符串长度(这里就是9),每次判断都是寻找最小的数,如果相同,就再比较下一级,直到找出小的序列,然后改变开头数(ans)。

main函数里的for就是用来判断开头数哪个小,而less函数里的for就是用来判断如果开头数相同,那么就比较下一个数,再比较下一个,直到不相同(ps:如果开头数不同的话其实for循环是没啥用的)

在这里插入图片描述

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...