环状函数算法思路解读(紫书答案)

题目:长度为n的环形串有n种表示法,分别为从某个位置开始顺时针得到。在这些表示法中,字典序最小的称为“最小表示”。字典序最小:较短的字符串字典序较小。从第一个字符比较,某个位置字符较小的串字典序较小。

图片如下:

环状函数算法思路解读(紫书答案)_第1张图片

 首先可以用以下序列表示所有表示法

如ABCDSD ->ABCDSDABCDSD.

从中截取六个连续字符即可。假如用a[5]存储ABCDSD

所有表示法列出有些近似二维数组。

接下来思路更加清晰了。

先找出第一列的最小值。如果只有一个最小值就得出解。

如果有多个最小值就比较第二列的值。

如果第二列有多个最小值就比较第三列。依次类推。

很明显需要两层循环+判断了。

接下来结合紫书答案进行解读

#include
#include
#define maxn 50
 
//判断表示法p是否比表示法q字典序小 
int less(const char* s,int p,int q){
	int n=strlen(s);
	for(int i=0;i

t用于控制输入字符串次数,无甚作用。

自定义函数的i是相当于我们思路中的列数,

而least用于标记最小值的位置。从主函数i=0开始

程序比较第一列中的1,2行对应字符

当(s[(i+p)%n]==s[(i+q)%n时,列数+1继续比较,直至找到这两行的字典序大小关系。

当前者小于后者least=行数表示最小字典序迁移到该行。

当前者大于后者least不变。

而这时我们已将可以可以看出自定义函数的作用是比较两行字符串字典序大小

并且得出更小的一行。而for循环其实就是提供遍历,

相当于与在一个一维数组找最小值。

现在代码的原理应该理解了吧!

以上都是萌新的个人想法,如有错误和更好的解释,敬请指教!

你可能感兴趣的:(算法,c语言)