持续创作,加速成长!这是我参与「掘金日新计划 · 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)