刷题日记 1071. 字符串的最大公因子

73 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

一、题目描述:

1071. 字符串的最大公因子

对于字符串 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 由大写英文字母组成

二、思路分析:

思路:获取每个字符串所有的约数 遍历+判断
找到最长的字符串作为基准字符串
遍历基准字符串的约数数组,从后往前,后面的约束较长
如果在第二个字符串的约数数组中也存在该约数,则返回该约数
如果遍历所有的约数也没有发现这样的约数,则不存在最大公约数,返回""

三、AC 代码:

    /**
     * @param {string} str1
     * @param {string} str2
     * @return {string}
     */
    var gcdOfStrings=function(str1,str2) {
        let gcd_str1=gcd(str1)
        let gcd_str2=gcd(str2)
        if(str1.length>str2.length){
            for(let gcd_ of gcd_str1.reverse()){
                if(gcd_str2.indexOf(gcd_)!==-1){
                    return gcd_
                }
            }
        }else{
            for(let gcd_ of gcd_str2.reverse()){
                if(gcd_str1.indexOf(gcd_)!==-1){
                    return gcd_
                }
            }
        }
        return ""
    }
    /**
     * @param {string} str
     * @return {Array} gcd
     */
    var gcd=function(str){
        let gcds=[]
        let length=str.length
        for(let i=1;i<length+1;i++){
            let pattern=str.slice(0,i)
            if(chk_pattern(str,pattern)){
                gcds.push(pattern)
            }
        }
        return gcds
    }
    /**
     * @param {string} str
     * @param {string} pattern
     * @return {Boolean}
     */
    var chk_pattern=function(str,pattern){
        let len=pattern.length
        if(str.length%len!==0){
            return false
        }
        for(let i=0;i<str.length/len;i++){
            let part=str.slice(i*len,(i+1)*len)
            //console.log(part)
            if(part!==pattern){
                return false
            }
        }
        return true
    }

范文参考

先求长度的最大公因数,再判断长字符串是否是倍数个最大公共字符串 - 字符串的最大公因子 - 力扣(LeetCode)

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