-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1071_gcdOfStrings.cc
More file actions
55 lines (54 loc) · 1.32 KB
/
1071_gcdOfStrings.cc
File metadata and controls
55 lines (54 loc) · 1.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
/*
int gcd(int a, int b)
{
if (0==b) return a;
return gcd(b, a%b);
}
*/
class Solution2 {
public:
string gcdOfStrings(string str1, string str2) {
int max=0, m=str1.size(), n=str2.size();
//if (m<n) return gcdOfStrings(str2,str1);
for (int i=1; i<=m && i<=n && str1[i-1]==str2[i-1]; ++i) {
if (m%i==0 && n%i==0) {
bool isdiv=true;
string s=str1.substr(0,i);
for (int j=2*i; isdiv && j<=m; j+=i)
isdiv = (s == str1.substr(j-i, i));
for (int j=2*i; isdiv && j<=n; j+=i)
isdiv = (s == str2.substr(j-i, i));
if (isdiv) max = i;
}
}
return str1.substr(0,max);
}
};
class Solution {
public:
/*
Try to explain it here:
Assume 2 strings are divided by T
Then:
str1 = nT
str2 = mT
n > m:
tempStr = str1-str2 = (n-m)T = kT
str2 - tempStr = (m-k)T = aT
*/
string gcdOfStrings(string str1, string str2) {
if (str1.size()<str2.size()) return gcdOfStrings(str2,str1);
if (str2.empty()) return str1;
if (str1.substr(0, str2.size()) != str2) return ""; /*nT-mT=(n-m)T*/
return gcdOfStrings(str1.substr(str2.size()), str2);
}
};
int main(){
Solution s1;
Solution2 s2;
string A1{"ABABAB"}, A2{"ABAB"};
cout << s1.gcdOfStrings(A1,A2) << ": ";
cout << s2.gcdOfStrings(A1,A2) << endl;
}