当前位置: 代码迷 >> 综合 >> js + leetcode刷题:No.1071 字符串的最大公因子
  详细解决方案

js + leetcode刷题:No.1071 字符串的最大公因子

热度:107   发布时间:2023-09-22 02:34:29.0

题目:

对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。

解法:

思路:(以下思考来源 – leetcode账户gatsby-23)
“除尽”——字符串str1和str2内只存在一或多个的字符X。可得公式,str1 + str2 = (x + y)X。那么同理,str2 + str1 = (y + x)X。满足这个条件,则必存在。接着求约数:

约数。整数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。

/*** @param {string} str1* @param {string} str2* @return {string}*/
var gcdOfStrings = function(str1, str2) {// 不想等间接说明了不存在字符串Xif(str1 + str2 !==  str2 + str1){return ''}// 最大公约数计算公式var gcd = function(num1, num2){// 利用辗转相除法(欧几里得算法)来计算最大公约数,即字符串X在字符串str1中截止的索引位置return num2 === 0 ? num1: gcd(num2, num1 % num2)}// 截取匹配的字符串return str1.substring(0, gcd(str1.length, str2.length))
};