描述
给定一个长度为n的字符串S,如果存在一个字符串T,重复若干次T能够得到S,那么,S叫做周期串,T叫做S的一个周期。
如:abababab是一个周期串,abab,ab都是它的周期,其中,ab为它的最小的周期串。
使用next,线性时间解决问题
- k=next[len],p=len-k;
- 若len%p==0,则p为最小周期长度,前p个字符就是最小周期
- 若len%p!=0,则字符串不存在周期
这里,我们对next数组多求了一位,即next[len]位。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using namespace std;
int next[100];
void GetNext(char* str)
{
next[0]=-1;
int k=-1;
int j=0;
int len=strlen(str);
while(j<len)
{
if(k==-1||str[j]==str[k])
{
next[j+1]=k+1;
j++;
k++;
}
else
{
k=next[k];
}
}
}
int main()
{
char str[100];
while(scanf("%s",str)!=EOF)
{
GetNext(str);
int len=strlen(str);
int p=len-next[len];
if(p==len)
{
printf("NULL\n");
}
else if(len%p==0)
{
for(int i=0;i<p;i++)
{
printf("%c",str[i]);
}
printf("\n");
}
else
{
printf("NULL\n");
}
}
return 0;
}