使用语言:c++
题目:
对于字符串
s
和t
,只有在s = t + t + t + ... + 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.什么叫约数?
约数其实就是能够整除给定整数的数比如6/3=2,3就是6的约数
约数也称为因数或因子
(易混辨析:质数/合数)
质数是指只能被1和它本身整除的自然数,最小的质数是2,也是唯一的偶数质数
合数是指除了1和它本身之外,还能被其他自然数整除的自然数
2.其实length()方法返回的就是整数型了,所以官方题解中所做的强制类型转换的目的可能是为了确保类型明确
int lenx = (int)s.length() / (int)t.length();
3.在c++中true表示为1,false表示为0
4.substr用法
string s="hello world";
sub=s.substr(6);//表示提取从索引7到字符串末尾的位置,即world
sub=s.substr(1,4);//表示提取从索引1开始,长度为4的部分。即ello
好了明确这些了以后,给出我参考官方题解写的代码
class Solution {
public:
// 检查是否str是由x组成的bool check(string x,string str){int num=str.length()/x.length();string s;for(int i=0;i<num;i++){s+=x;}return s==str;//判断由num个x堆砌起来的s是否和str一样,如果一样的话则说明x能除尽str}
public:string gcdOfStrings(string str1, string str2) {int len1=str1.length();int len2=str2.length();int len=min(len1,len2);for(int i=len;i>0;i--){//因为题目要求求取最长字符串,所以从长度大的开始枚举if(len1%i==0&&len2%i==0){//只有长度能被整除,这个字符串才有可能除尽str//因为x必定是要整除str1和str2的,所以不用求取到底截取谁的字符串,哪一个都一样string x=str1.substr(0,i);if(check(x,str1)&&check(x,str2))return x;//都能除尽,说明找到了}}return "";//如果for循环走完都没有的话,那说明没有最大公约数}};