题目描述:输入一个字符串,判断其是否完全循环,若是循环的,输出最短的循环子串,否则输入空“”。例如:输入abababab,输出ab,输入ab,则输出“”。 由此可得:输入格式为abcabcabcabc|aaa,输出格式为:abc|a(最短的循环子串)。
题目思路:1.当字符串空串时或者只有一个字符,循环不存在,直接返回空串或原字符。
2.当字符串不为空串时,题目要求循环子串,原字符最少有一个子串循环两次。
利用for循环一次得到一个模板字符串,判断它是否符合要求。
如何判断字符串是否符合要求:1.先判断原字符串的长度是否能整除模板字符串,如果不能,这个模板字符串不是循环子串。
2.从原字符串中得到和模板字符串相同长度的子串,判断子串是否和模板相等,当所有子串和模板子串相等时,就是要找的最短循环子串。如果出现一个不相等,则不是。
代码如下:public class Main {
public static String solution(String inp) {
// 遍历所有可能的子串长度
for (int len = 1; len <= inp.length() / 2; len++) {
// 提取子串
String sub = inp.substring(0, len);
// 验证子串是否能重复构成原字符串
if (isRepeatedSubstring(inp, sub)) {
return sub;
}
}
// 如果没有找到循环子串,返回空字符串
return "";
}
// 需要实现的方法:验证 sub 是否能重复构成 inp private static boolean isRepeatedSubstring(String inp, String sub) { // 计算需要拼接的次数 int repeatCount = inp.length() / sub.length();
// 拼接 sub 多次
StringBuilder repeated = new StringBuilder();
for (int i = 0; i < repeatCount; i++) {
repeated.append(sub);
}
// 比较拼接结果与 inp
return repeated.toString().equals(inp);
}
public static void main(String[] args) { // 测试用例 System.out.println(solution("abcabcabcabc").equals("abc")); } }
关键步骤
- 计算需要拼接的次数:通过
inp.length() / sub.length()计算需要拼接sub的次数。 - 拼接子串:使用
StringBuilder拼接sub多次。 - 比较拼接结果:将拼接后的字符串与
inp进行比较,如果相等,则返回true,否则返回false。
建议:当面对一个题目时,首先应当考虑题目存在条件以及解题思路,分析题目中出现的可能性,多次实验,最后得到正确的答案。在某些点上要考虑到位,细节决定成败。当然,有一个工具的帮助,题目也会变得简单,在验证时,可以利用字符串的长度关系来减少不必要的计算。
总结:面对任何问题面前仿佛你在大海中找不到方向,这个时候有一个豆包MarsCode AI为你提供解题思路,解决问题也是事半功倍,当面对困难时,我不是孤立无援,它不仅仅是提高了我解题的效率,同时,也给我们带来了方便。在这个平台我看到了更多的知识点以及更多人分享的学习方法。