20行代码AC——习题3-4 周期串(UVa-455)_解题报告

励志用尽量少的代码做高效表达


题目(提交)链接——>UVa-455


题意:

输入一个长度不超过80的字符串,输出其最小周期。

思路:

本题的最佳思路是取余构造循环串求最小周期
按照正常求周期的方法,若取不同周期长度,遍历次数也会不同,稍有不慎遍历的字符就会漏掉或溢出。
因此我们采取取余的方式将串首位相连,在逻辑上增加串的长度,使得取不同周期长度遍历的次数都是相同的,这样就可以用一个循环解决问题。
当然,本题采用字符串分割的方式也可以解决,但太臃肿,低效,因此笔者没有给出实现代码。

代码:

#include 
using namespace std;
int main() {
	char str[100];
	int N; cin >> N; while(N--) {
		cin >> str;
		int len = strlen(str), t = 1;
		while(1) {
			int c = 0; 
			for(int i = 0; i<len; ++i) 					
				if(str[i] == str[(i+t)%len]) ++c;
				else break;								//降低消耗 
			if(c == len) break;
			t++;
		}
		cout << t << endl;
		if(N != 0) cout << endl; 
	}
	return 0;
}

读书时时有个我在,行事桩桩少对人言。

你可能感兴趣的:(数组和字符串,算法竞赛与入门经典,c++)