算法--辗转相除法

gcd 算法–辗转相除法

遇到一题算法题,如下:

求字符串的最大公因子?

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

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

接下来回顾下两个数学概念:

  • 约数。整数a除以整数b(b≠0)除得的商正好是整数而没有余数,那么整数b称为a的约数。即4的正约数有:1、2、4。代入到字符串中,则意味着字符串ABC的约数(其实就是子字符串)共有A,B,C三个。
  • 最大公约数。两个或多个整数共有约数中最大的一个被称为最大公约数。举例:求数值3和数值9的最大公约数。数值3的正约数有1,3,数值9的正约数有1,3,9,数值3与数值9约数并集(既存在3的约数集中,又存在9的约数集中的数的集合)为1、3。则最大公约数为3。写作gcd(3,
    9) = 3。附,gcd是英文Greatest Common
    Divisor(最大公约数)的缩写。代入到字符串中,则字符串ABCABC和字符串ABC的最大公约数为ABC,即本题中所需要的最大公因子。

那么问题的关键就可以,如何求得最大公约数?在数学中,可以利用辗转相除法来计算最大公约数。

辗转相除法是以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数的计算公式。如下:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1

由此,可以写出gcd函数:

// 最大公约数计算公式
function gcd(num1, num2) {
    // 利用辗转相除法来计算最大公约数
    return num2 === 0 ? num1 : gcd(num2, num1 % num2); 
}

所以,整道题的题解是:
算法--辗转相除法_第1张图片
因此代码为:

var gcdOfStrings = function(str1, str2) {
    if(str1 + str2 !== str2 + str1) return '';
    const gcd =(a,b)=>(0===b?a:gcd(b,a%b))
    return str1.substring(0,gcd(str1.length,str2.length))
};

考题出处:https://leetcode.cn/problems/greatest-common-divisor-of-strings/submissions/

你可能感兴趣的:(算法)