import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str1 string字符串 * @param str2 string字符串 * @return string字符串 */ public String lcmOfStrings (String str1, String str2) { // write code here int n = str1.length(); int m = str2.length(); int k = n / GCD(n, m) * m; StringBuilder res1 = new StringBuilder(); StringBuilder res2 = new StringBuilder(); for (int i = 0; i < k; i += n) { res1.append(str1); } for (int i = 0; i < k; i += m) { res2.append(str2); } return res1.toString().equals(res2.toString()) ? res1.toString() : ""; } private int GCD(int a, int b) { return b == 0 ? a : GCD(b, a % b); } }
编程语言是 Java。
该题考察的知识点包括:
- 字符串操作,包括字符串的长度、拼接等。
- 辗转相除法的应用。
- 循环控制,通过循环构建重复子串。
代码解释:
- 在 lcmOfStrings 方法中,计算两个字符串的长度 n 和 m,以及它们的最大公约数 GCD(n, m)。通过 n 除以 GCD(n, m),再乘以 m,得到一个值 k,即最小公倍数的长度。
- 使用两个 StringBuilder 对象 res1 和 res2 来分别构建由 str1 和 str2 构造出的长度为 k 的字符串。
- 通过循环遍历,每次累加 str1 到 res1,确保 res1 长度为 k。
- 通过循环遍历,每次累加 str2 到 res2,确保 res2 长度为 k。
- 比较 res1 和 res2 是否相等。如果相等,说明可以通过重复构造生成相同的子串,返回 res1。如果不相等,说明无法找到满足条件的子串,返回空字符串。