算法笔记 -- 1071. 字符串的最大公因子

99 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

一、题目描述:

1071. 字符串的最大公因子 - 力扣(LeetCode)

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

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

 

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

二、思路分析:

第一步找到重复的子串
这里我们通过遍历str1和str2中长度小的那个字符串
用repeat这个方法来找到子串
找到子串后用replace方法把str1和str2中的所有子串替换成符号 然后如果str1和str2里面包含除了符号然后如果str1和str2里面包含除了符号以外的字符就返回空
然后计算str1和str2中$符号的个数
再用欧几里得算法求出两个数字的公因数
最后再用子串的repeat方法返回就可以了

三、AC 代码:

/**
 * @param {string} str1
 * @param {string} str2
 * @return {string}
 */
var gcdOfStrings = function(str1, str2) {
    let S = str1.length<str2.length?str1:str2
    for(var x=1;x<S.length;x++){
        if(S.slice(0,x+1).repeat(S.length/(x+1)) == S){
            break;
        }
    }
    let str = S.slice(0,x+1)
    let reg = new RegExp(str,'g');
    str1 = str1.replace(reg,'$');
    str2 = str2.replace(reg,'$');
    if(str1.match(/[^$]/) != null ||str2.match(/[^$]/) != null) return '';
    return str.repeat(Gcd(str1.length,str2.length))
};
function Gcd(i,j){
    var temp;
    while (j>0){
        temp=i%j;
        i=j;
        j=temp;
    }
    return i;
}

范文参考

先判断字符串是否符合重复规律,然后求两个字符串最大因子 - 字符串的最大公因子 - 力扣(LeetCode)

比较暴力的解法。遍历比较短的字符串,判断两个字符串是不是有字串构成的。 - 字符串的最大公因子 - 力扣(LeetCode)