这是我参与「第七届青训营 」伴学笔记创作活动的第3天
今天的代码练习题目是:
字符串最短循环子串
问题描述
小M在研究字符串时发现了一个有趣的现象:某些字符串是由一个较短的子串反复拼接而成的。如果能够找到这个最短的子串,便可以很好地还原字符串的结构。你的任务是给定一个字符串,判断它是否是由某个子串反复拼接而成的。如果是,输出该最短的子串;否则,输出空字符串""。
例如:当输入字符串为 abababab 时,它可以由子串 ab 反复拼接而成,因此输出 ab;而如果输入 ab,则该字符串不能通过子串的重复拼接得到,因此输出空字符串。
测试样例
样例1:
输入:
inp = "abcabcabcabc"
输出:'abc'
样例2:
输入:
inp = "aaa"
输出:'a'
样例3:
输入:
inp = "abababab"
输出:'ab'
样例4:
输入:
inp = "ab"
输出:''
样例5:
输入:
inp = "abcdabcdabcdabcd"
输出:'abcd'
样例6:
输入:
inp = "b"
输出:''
题目解析
首先将每一种可能的字符串切出来,然后通过循环比较,字串通过取余循环,来判断是否为循环字串,如果j走到了最后,那么当前的字串就是他的循环字串,因为是从小的串开始,如果j走到了最后那么就不会切更大的字串直接跳出循环,保证了是最小的字串,如果i走到最后还没有找到,那么结果就是“”。
代码如下:
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
}
}
学习方法与心得
今天想和大家分享的是我这几天的编写程序的心得与方法
首先,我认为编程前的准备是必不可少的。
在开始编写程序之前,充分的准备工作至关重要。首先是对问题的理解,明确程序要实现的功能和目标。例如,如果要编写一个学生成绩管理系统,就要清楚需要处理哪些数据,如学生的基本信息、各科成绩,以及需要实现的功能,像成绩录入、查询、统计等。这一步如同建筑的蓝图设计,是后续编程的指导方向。
其次是选择合适的编程语言和开发工具。不同的项目有不同的语言偏好,比如网页开发可能会选择 JavaScript、Python 等,而系统级编程可能会使用 C、C++。开发工具也有很多种,如 Visual Studio Code、IntelliJ IDEA 等,选择熟悉且适合项目的工具可以提高效率。
然后,我发现编程过程中的要点也是要相对明确的。
在编写代码阶段,保持清晰的逻辑是关键。将复杂的问题分解成一个个小的模块,每个模块实现一个特定的功能。以刚才的成绩管理系统为例,可以将其分为数据输入模块、数据存储模块、查询模块等。这样可以使代码结构更加清晰,易于调试和维护。
代码的可读性也不容忽视。使用有意义的变量名和函数名,遵循统一的代码风格,比如代码的缩进、括号的使用等。例如,用“studentName”表示学生姓名变量,而不是简单的“s”。同时,添加适当的注释来解释代码的功能和逻辑,尤其是复杂的算法部分。这不仅方便自己日后回顾代码,也有利于团队协作。
此外,要善于利用现有的代码库和框架。许多编程语言都有丰富的开源库,如 Python 的 NumPy、Pandas 等,可以节省大量的开发时间。在使用这些库时,要仔细阅读文档,了解其功能和使用方法。
最后,调试与优化的过程也需要我们去认真对待。
编写程序不可能一蹴而就,调试是必经的过程。当程序出现错误时,不要慌张。可以通过打印输出中间结果、使用调试工具等方法来定位问题。对于一些逻辑错误,要仔细检查代码的执行流程和条件判断。
在程序功能实现后,还需要进行优化。优化包括算法优化和代码性能优化。例如,选择更高效的排序算法,或者减少不必要的内存占用。但要注意优化的平衡,不要为了微小的性能提升而使代码变得过于复杂难以理解。
总之,编写程序是一个富有挑战性和创造性的过程,需要不断地学习、实践和总结,才能编写出高质量的程序。