题目和解题思路来源 Leetcode,感谢🙇,如果内容对您有帮助,欢迎点赞!
题目描述
- 对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
- 返回最长字符串 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 <= 1000
- 1 <= str2.length <= 1000
- str1[i] 和 str2[i] 为大写英文字母
解题思路
- 如果 str1 和 str2 有最大公因子字符串 X 时,一定可以推出: s t r 1 = X + X + ⋯ + X = n X s t r 2 = X + X + ⋯ + X = m X str1 = X + X + \cdots + X = nX \\ str2 = X + X + \cdots + X = mX str1=X+X+⋯+X=nXstr2=X+X+⋯+X=mX
- 此时 str1 和 str2 的和可以表示为: s t r 1 + s t r 2 = n X + m X = ( n + m ) X ⋯ ( 1 ) s t r 2 + s t r 1 = m X + n X = ( n + m ) X ⋯ ( 2 ) str1 + str2 = nX + mX = (n+m)X \cdots (1)\\ str2 + str1 = mX + nX = (n+m)X \cdots (2) str1+str2=nX+mX=(n+m)X⋯(1)str2+str1=mX+nX=(n+m)X⋯(2)
- 根据(1) (2)可推导出如果存在最大公因子字符串 X 时,一定有: ( 1 ) a n d ( 2 ) ⇒ s t r 1 + s t r 2 = s t r 2 + s t r 1 \\ (1)\ and \ (2) \Rightarrow str1 + str2 = str2 + str1 (1) and (2)⇒str1+str2=str2+str1
- 那么若 s t r 1 + s t r 2 = s t r 2 + s t r 1 str1 + str2=str2+str1 str1+str2=str2+str1,那么此时 X 的长度一定为 g c d ( l e n s t r 1 , l e n s t r 2 ) gcd(len_{str1}, len_{str2}) gcd(lenstr1,lenstr2)
- 更多解题思路 leetcode - 字符串的最大公因子
完整代码
class Solution {
public:
inline int gcd(int a, int b) {return b == 0? a : gcd(b , a % b);}
string gcdOfStrings(string str1, string str2) {
if(str1 + str2 == str2 + str1){
return str1.substr(0, gcd(str1.length(), str2.length()));
}
else
return "";
}
};
执行结果
题目和解题思路来源 Leetcode,感谢🙇,如果内容对您有帮助,欢迎点赞!