文章目录
- 题目描述
- 解法
- 枚举
- 累加
- 两倍
- 正则
题目描述
如果一个字符串可以由某个长度为 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;
}