新人环状序列

本人是小白,还请大神多多指教~

例子: 有一个长度为 n=3 的字符串 abc, 而环状的abc可以表示成 abc、bca、cab


如果程序要在 abc里面获取到 abc、bca、cab ,则

在a(包含a)开始向后读取3个字符串

在b(包含b)开始向后读取3个字符串

在c(包含c)开始向后读取3个字符串

b和c开始向后读取3个字符,读取超出数组范围怎么办?

可以看成为  abcabc 从第一个字符index=0 (index递增) 开始读取,每次读取长度len=3的字符串 就可以读取到abc、bca、cab

0  1  2  3  4  5

a  b  c  a  b  c

例如 从c开始向后读取3个字符,读取到 c+1=3 的时候是只要 3 % 3 =0(即a的索引值)

                                                读取到 c+2=4 的时候是只要 4 % 3 =1(即b的索引值)

这样就可以继续向后读取环状的字符了

可以看出  索引超过字符长度后 可以通过 (索引值%字符串长度) 得到前面的字符索引

#include<iostream>
using namespace std;

char s[100];
int n;
bool judge(int p,int q) {
	int i;
	for (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 i, k, minIndex = 0;
	cin >> n;
	k = n;
	for (i = 0; i < n; i++)cin >> s[i];

	while (k--) {
		if (judge(n - k, minIndex))minIndex = n - k;
	}

	cout << minIndex;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq742762377/article/details/80530212