字符串最短循环子串 | 豆包MarsCode AI刷题

51 阅读3分钟

public class Main { public static String solution(String inp) { int n = inp.length(); for (int len = 1; len <= n / 2; len++) { // Check lengths from 1 to n / 2 if (n % len == 0) { // Only consider lengths that divide the string length evenly String substring = inp.substring(0, len); // Get the potential repeating substring StringBuilder sb = new StringBuilder();

            // Build the string from repeating the substring
            for (int j = 0; j < n / len; j++) {
                sb.append(substring);
            }

            // Check if the built string is equal to the original string
            if (sb.toString().equals(inp)) {
                return substring; // Found the repeating substring
            }
        }
    }
    return ""; // If no substring found, return empty string
}

public static void main(String[] args) {
    // Add your test cases here
    System.out.println(solution("abcabcabcabc").equals("abc")); // Should print true
    System.out.println(solution("aaa").equals("a")); // Should print true
    System.out.println(solution("abababab").equals("ab")); // Should print true
    System.out.println(solution("ab").equals("")); // Should print true
    System.out.println(solution("abcdabcdabcdabcd").equals("abcd")); // Should print true
    System.out.println(solution("b").equals("")); // Should print true
}

}

代码片段分析

这段代码的核心功能是找到一个字符串中是否存在某个子串,该子串能够重复拼接成原字符串。具体的逻辑步骤如下:

1. 构建字符串

for (int j = 0; j < n / len; j++) {
    sb.append(substring);
}
  • 该部分代码使用 for 循环来构建一个新的字符串 sb,其内容是将 substring 重复 n / len 次。
  • n 是原字符串 inp 的长度,len 是当前要检查的子串 substring 的长度。
  • 这样构建的字符串 sb 实际上是一个由多个相同子串拼接而成的新字符串。

2. 比较字符串

if (sb.toString().equals(inp)) {
    return substring; // Found the repeating substring
}
  • 一旦完成拼接,接下来的代码将构建的字符串 sb 转换为字符串并与原始输入字符串 inp 进行比较。
  • 如果 sbinp 相等,表示当前的 substring 是一个能重复拼接而成的子串,因此返回该子串。

3. 返回结果

return ""; // If no substring found, return empty string
  • 如果经过所有可能的子串长度检查后,都没有找到合适的重复子串,则函数返回一个空字符串 ""

代码的核心函数

虽然在你的代码片段中未包含完整的函数定义以及 solution 方法的具体实现,但可以推测它的结构大致是这样的:

public static String solution(String inp) {
    int n = inp.length();
    for (int len = 1; len <= n / 2; len++) { // 遍历可能的子串长度
        String substring = inp.substring(0, len);
        
        StringBuilder sb = new StringBuilder();
        // 这里是构建重复字符串的部分
        for (int j = 0; j < n / len; j++) {
            sb.append(substring);
        }

        // 比较构建的字符串与原字符串
        if (sb.toString().equals(inp)) {
            return substring; // 找到了重复的子串
        }
    }
    return ""; // 如果没找到,返回空字符串
}

4. 主方法测试

public static void main(String[] args) {
    System.out.println(solution("abcabcabcabc").equals("abc")); // 应该打印 true
    System.out.println(solution("aaa").equals("a")); // 应该打印 true
    System.out.println(solution("abababab").equals("ab")); // 应该打印 true
    System.out.println(solution("ab").equals("")); // 应该打印 true
    System.out.println(solution("abcdabcdabcdabcd").equals("abcd")); // 应该打印 true
    System.out.println(solution("b").equals("")); // 应该打印 true
}
  • main 方法包含一系列的测试用例以验证 solution 函数的有效性。
  • 每个测试用例调用 solution,并与期望结果进行比较。通过 System.out.println() 输出比较的结果,确认函数的正确性。

总结

整体上,这段代码的逻辑非常清晰,通过构建重复字符串并与原字符串进行比较来查找重复的子串。它的复杂度主要集中在对可能的子串长度的遍历和字符串拼接的过程,适合用于理解如何通过构造与比较来解决某些字符串问题。