ACM学习历程23——最小周期串问题
最小周期串问题属于字符串操作的基本题型之一,要求给定一个字符串找出其中最小的周期长度和最小周期子串。对于周期串的定义如下:如果一个字符串是以一个或者一个以上的长度为K的重复字符串连接成的,那么这个字符串就叫做周期为K的串。找最小周期串的方法可以通过以下方式实现:
一、从字符串的起始位置遍历,对于字符串长度为N的字符串,那么周期串的可能长度介于1—N之间,所以可以假设周期串的长度为i,其中1<=i<=N。满足最小周期串的条件之一是length%i==0,这是因为如果所述i是字符串的周期串长度,那么整个字符串可以被划分成整数个长度为i的周期子串,如果这个整除的条件不成立,说明i也不是字符串的周期串长度。满足最小周期串的条件之二是,变量j从i的位置开始一直到字符处结束的位置,满足(s[j]!=s[j%i])这个条件,这是因为若从0到i-1这个区间组成的子串是该字符串的周期串,那么从i到length-1的位置是该最小字符串的若干次重复。由于上述i的取值是从1即从最小值开始取值的,因此当上述两个条件都成立时,即可求得最小周期串长度和最小周期串。
https://blog.youkuaiyun.com/u010480899/article/details/52372063
-
-
-
using namespace std;
-
-
int main()
-
{
-
int i,j;
-
int flag; //判断最小周期串是否找到,找到值为1,否则为0
-
char ss[ 100];
-
string s;
-
while( cin.getline(ss, 100))
-
{
-
s=ss;
-
int length=s.length();
-
for(i= 1;i<=length;i++)
-
{
-
if(length%i== 0)
-
{
-
flag= 1;
-
for(j=i;j<length;j++)
-
{
-
if(s[j]!=s[j%i])
-
{
-
flag= 0;
-
break;
-
}
-
}
-
if(flag)
-
{
-
cout<< "The cycle="<<i<< endl;
-
cout<< "The minimum string="<<s.substr( 0,i)<< endl;
-
break;
-
}
-
}
-
}
-
}
-
return 0;
-
}
-
测试结果:
-
121212
-
The cycle= 2
-
The minimum string= 12
-
1234512345
-
The cycle= 5
-
The minimum string= 12345
-
-
-
using namespace std;
-
-
int main()
-
{
-
int i;
-
char ss[ 100];
-
string s;
-
while( cin.getline(ss, 100))
-
{
-
s=ss;
-
int length=s.length();
-
for(i= 1;i<=length;i++)
-
{
-
if(length%i== 0)
-
{
-
int j=i,k= 0,N= 1;
-
while(j<length && k<i)
-
{
-
if(s[j]==s[k])
-
{
-
j++;
-
k++;
-
if(k==i)
-
{
-
k= 0;
-
N++;
-
}
-
}
-
else
-
{
-
N= 1;
-
break;
-
}
-
}
-
if(j==length)
-
{
-
cout<< "T="<<i<< endl;
-
cout<< "N="<<N<< endl;
-
cout<< "The minimum string="<<s.substr( 0,i)<< endl;
-
break;
-
}
-
}
-
}
-
}
-
return 0;
-
}
-
测试结果:
-
123123
-
T= 3
-
N= 2
-
The minimum string= 123