1.对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings
方法一:枚举
class Solution { public: string gcdOfStrings(string str1, string str2) { int len1=(int)str1.length(); int len2=(int)str2.length(); for(int i=min(len1,len2);i>=1;i--)//返回最长,因此从最长的字符串开始枚举 { if(len1%i==0&&len2%i==0)//长度可以被两个字符串都整除 { string str=str1.substr(0,i); if(check(str,str1)&&check(str,str2)) return str; } } return ""; } bool check(string t,string str) { int sum=(int)str.length()/(int)t.length();//计算有几个子长度 string check=""; for(int i=1;i<=sum;i++) { check+=t; } return check==str; } };
方法二:如果 str1 和 str2 拼接后等于 str2和 str1 拼接起来的字符串(注意拼接顺序不同),那么一定存在符合条件的字符串 X
class Solution { public: string gcdOfStrings(string str1, string str2) { if (str1 + str2 != str2 + str1) return ""; return str1.substr(0, __gcd((int)str1.length(), (int)str2.length())); // __gcd() 为c++自带的求最大公约数的函数 return ""; } };