题目描述
如果一个字符串可以由某个长度为 k k k的字符串重复多次得到,则称该串以 k k k 为周期。例如, a b c a b c a b c a b c abcabcabcabc abcabcabcabc 以 3 3 3 为周期(注意,它也以 6 6 6 和 12 12 12为周期, 但是需要选取最小的周期)。
abcabcabc
3
abab
2
aba
3
a
1
aa
1
解法
枚举
static int get(String str)
{
int n = str.length();
char s[] = str.toCharArray();
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
boolean f = true; // 判断是否成为周期串
for (int j = i; j < n; j++)
{
if (s[j] != s[j % i])
{
f = false;
break;
}
}
if (f)
return i;
}
}
return -1;
}
累加
static int get(String s)
{
int n = s.length();
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
String a = s.substring(0, i);
String b = "";
for (int j = 1; j <= n / i; j++)
b += a;
if (b.equals(s))
return i;
}
}
return -1;
}
两倍
static int get(String s)
{
String str = s + s;
int n = s.length();
for (int i = 1; i <= n; i++)
{
String a = str.substring(i, i + n);
if (a.equals(s))
return i;
}
return -1;
}
正则
可以利用正则的替换功能来实现。
从前往后遍历,截取从头到当前的字段来替换字符。
假如替换完的字符串长度为0的话,那么周期串的长度则为他。
static int get(String s)
{
int n = s.length();
for (int i = 1; i <= n; i++)
{
String a = s.substring(0, i);
String b = s.replaceAll(a, "");
if (b.length() == 0)
return i;
}
return -1;
}