Skip to content

No.1071 字符串的最大公因子

对于字符串 s 和 t,只有在 s = t + t + t + ... + t + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。

给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。

示例 1:

text
输入:str1 = "ABCABC", str2 = "ABC"
输出:"ABC"

示例 2:

text
输入:str1 = "ABABAB", str2 = "ABAB"
输出:"AB"

示例 3:

text
输入:str1 = "LEET", str2 = "CODE"
输出:""

提示:

  • 1 <= str1.length, str2.length <= 1000
  • str1 和 str2 由大写英文字母组成

解题思路

最大公约数 + 数学法,计算前缀串,若 str1 + str2 = str2 + str1,那么一定存在符合条件的 x

实现

完整逻辑

js
/**
 * @param {string} str1
 * @param {string} str2
 * @return {string}
 */
var gcdOfStrings = function (str1, str2) {
  // 求最大公约数
  function gcd(a, b) {
    let rest = a % b;
    while (rest !== 0) {
      a = b;
      b = rest;
      rest = a % b;
    }
    return b;
  }
  if (str1 + str2 !== str2 + str1) return "";
  return str1.substring(0, gcd(str1.length, str2.length));
};

简化逻辑

js
/**
 * @param {string} str1
 * @param {string} str2
 * @return {string}
 */
var gcdOfStrings = function (str1, str2) {
  // 求最大公约数
  function gcd(a, b) {
    let [x, y] = [a, b];
    while (y !== 0) {
      [x, y] = [y, x % y];
    }
    return x;
  }
  if (str1 + str2 !== str2 + str1) return "";
  return str1.substring(0, gcd(str1.length, str2.length));
};