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。

该题考察的知识点包括:

  • 字符串操作,包括字符串的长度、拼接等。
  • 辗转相除法的应用。
  • 循环控制,通过循环构建重复子串。

代码解释:

  1. 在 lcmOfStrings 方法中,计算两个字符串的长度 n 和 m,以及它们的最大公约数 GCD(n, m)。通过 n 除以 GCD(n, m),再乘以 m,得到一个值 k,即最小公倍数的长度。
  2. 使用两个 StringBuilder 对象 res1 和 res2 来分别构建由 str1 和 str2 构造出的长度为 k 的字符串。
  3. 通过循环遍历,每次累加 str1 到 res1,确保 res1 长度为 k。
  4. 通过循环遍历,每次累加 str2 到 res2,确保 res2 长度为 k。
  5. 比较 res1 和 res2 是否相等。如果相等,说明可以通过重复构造生成相同的子串,返回 res1。如果不相等,说明无法找到满足条件的子串,返回空字符串。