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

题目:

对于字符串 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) {
    // 不想等间接说明了不存在字符串X
    if(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))
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值