【记录练习】算法竞赛入门经典——例题3-6 环状序列

该博客主要探讨了一个关于环状字符串的问题,通过定义less函数比较字符串的字典序,寻找并输出环状字符串中字典序最小的子串。在main函数中,首先读取字符串,然后迭代寻找字典序最小的起始位置,并按此顺序输出字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目书P52页

 

#define maxn 105
int less(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])
			return s[(p + i) % n] < s[(q + i) % n];
	return 0;
}
int main() {
	int T;
	scanf("%d", &T);
	while (T--) {
		scanf("%s", s);
		int n = strlen(s);
		int ans = 0;
		for (int i = 0; i < n; i++)
			if (less(s, i, ans)) ans = i;
		for (int i = 0; i < n; i++)
			putchar(s[(ans + i) % n]);
		putchar('\n');
	}
	return 0;
}

此题对我来说挺难理解的。其中可以想象环状串任意取一个字符串头,然后通过main中的第一个for循环逐个进行比较。如何比较呢?即通过定义函数less。因less在if条件语句中,只有less返回值为1时才会进行ans=i。换句话说,if(less(s,i,ans)) ans = i;这句标记出了s串中字典序最小的位置,并把此位置赋值给ans。

接着又一个for循环从字典序最小位置开始putchar输出。

less函数作用为:

我们对比所取的串头,若相等,则继续进行顺时针相邻比较,若不相等,return进行s[(p+i)%n] <s[(q+i)%n]比较,如果此式为真,则返回1,为假则返回0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值