编写Java方法:检测字符串重复子串并返回其period(周期)长度或0
Java方法:判断字符串重复子串的周期长度
功能说明
实现一个Java方法,判断给定字符串是否由重复的相同子串构成,若存在则返回该子串的长度(即周期period),不存在则返回0。例如字符串"abcabcabcabcabc"的周期为3。
实现思路
- 快速校验重复可能性:若字符串
s由重复子串构成,将s与自身拼接得到s+s,去掉首尾各一个字符后,新字符串必然包含原s。这一步能快速排除无重复子串的情况。 - 寻找最小周期长度:遍历可能的子串长度(范围1到
s.length()/2),检查该长度是否能整除字符串总长度,且重复该子串可完全拼接出原字符串,第一个符合条件的长度即为最小周期。
代码实现
public class RepeatSubstringChecker { public static int findRepeatSubstringLength(String s) { // 边界处理:空串或长度小于2,直接返回0 if (s == null || s.length() < 2) { return 0; } String doubledStr = s + s; String trimmedStr = doubledStr.substring(1, doubledStr.length() - 1); // 修剪后的拼接串不包含原串,说明无重复子串 if (!trimmedStr.contains(s)) { return 0; } int strLength = s.length(); // 遍历所有可能的子串长度,寻找最小周期 for (int subLength = 1; subLength <= strLength / 2; subLength++) { if (strLength % subLength != 0) { continue; } String subStr = s.substring(0, subLength); boolean isRepeated = true; for (int i = subLength; i < strLength; i += subLength) { if (!subStr.equals(s.substring(i, i + subLength))) { isRepeated = false; break; } } if (isRepeated) { return subLength; } } return 0; } // 测试用例 public static void main(String[] args) { System.out.println(findRepeatSubstringLength("abcabcabcabcabc")); // 输出3 System.out.println(findRepeatSubstringLength("ababab")); // 输出2 System.out.println(findRepeatSubstringLength("abcd")); // 输出0 System.out.println(findRepeatSubstringLength("aaaaa")); // 输出1 } }
代码解释
- 边界处理:直接过滤空字符串或长度小于2的字符串,这类字符串不可能存在重复子串。
- 拼接校验:通过
s+s修剪后的字符串是否包含原串,快速判断是否存在重复子串的可能,减少后续不必要的遍历。 - 周期查找:从最小的可能子串长度开始遍历,找到第一个能完全重复构成原串的长度,保证返回的是最小周期。
内容的提问来源于stack exchange,提问作者Livio
相关产品推荐
相关产品推荐

