题解 | #名字串生成II#
名字串生成II
https://www.nowcoder.com/practice/a90b0c33344e4b8488fe0b376de3205d
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。如果不相等,说明无法找到满足条件的子串,返回空字符串。