携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
一、题目描述:
对于字符串 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)