您的位置:首页 > 其它

UVA 455

2016-02-03 10:25 323 查看
/*  Page57 3-4 */
#include<iostream>
#include<string>
using namespace std;
int main()
{
int time = 1, times = 0; //周期, 以及测试用的时间
string A;
cin >> A;
for (int i = 1; i != A.size(); i++)
{
if (A[0] != A[i])
time++;
else break;
}
//以下 确定这是一个循环
int Lable = 0;
int rounds = A.size() / time;//几轮的比较
times = time;
for (int i = 0; i < time; i++)//比较次数
{
for (int j = 0; j != rounds-1; j++){  //如果不是rounds-1而是rounds ,出现string溢出!!
if (A[i] == A[i + times]  )
{
Lable++;
}
times += time;
}
times = time;
}
if (Lable==(A.size()-time) )
cout << time << endl;
else
cout << "没最小周期" << endl;
system("pause");
return 0;
}

该版本只能解决周期内没有重复字母的形式,比如abc abc。遇到aabbaabb出现问题,百度后尝试使用枚举法:在长度范围之内,一个个枚举周期(周期必须能被总长度整除!)

网上搜到的新办法依然无法解决aabbaabb这样的问题,但是非常精炼。

/*  Page57 3-4  枚举法*/
#include<iostream>
#include<string>
using namespace std;
int main()
{
int time = 0;
string A;
cin >> A;
bool flag = false;
for (time = 1; time < A.size(); time++){//枚举周期
if (A.size() % time == 0) //长度肯定是周期的整数倍
flag = true;
for (int j = time; j < A.size(); j++)
{
if (A[j] != A[j%time])
flag = false;
break;
}
if (flag){
cout << "周期" << time << endl;
break;
}
}
system("pause");
return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: