New Solution "1071 - Greatest Common Divisor of Strings"
This commit is contained in:
parent
0042d3410b
commit
4c7451b1ff
@ -10,6 +10,7 @@ LeetCode
|
||||
|---| ----- | -------- | ---------- |
|
||||
|1207|[Unique Number of Occurrences](https://leetcode.com/problems/unique-number-of-occurrences/) | [C++](./algorithms/cpp/uniqueNumberOfOccurrences/Unique-Number-of-Occurrences.cpp)|Easy|
|
||||
|1170|[Compare Strings by Frequency of the Smallest Character](https://leetcode.com/problems/compare-strings-by-frequency-of-the-smallest-character/) | [C++](./algorithms/cpp/compareStringsByFrequencyOfTheSmallestCharacter/CompareStringsByFrequencyOfTheSmallestCharacter.cpp)|Easy|
|
||||
|1071|[Greatest Common Divisor of Strings](https://leetcode.com/problems/greatest-common-divisor-of-strings/) | [C++](./algorithms/cpp/greatestCommonDivisorOfStrings/GreatestCommonDivisorOfStrings.cpp)|Easy|
|
||||
|1030|[Matrix Cells in Distance Order](https://leetcode.com/problems/matrix-cells-in-distance-order/) | [C++](./algorithms/cpp/matrixCellsInDistanceOrder/MatrixCellsInDistanceOrder.cpp)|Easy|
|
||||
|1029|[Two City Scheduling](https://leetcode.com/problems/two-city-scheduling/) | [C++](./algorithms/cpp/twoCityScheduling/TwoCityScheduling.cpp)|Easy|
|
||||
|1028|[Recover a Tree From Preorder Traversal](https://leetcode.com/problems/recover-a-tree-from-preorder-traversal/) | [C++](./algorithms/cpp/recoverATreeFromPreorderTraversal/recoverATreeFromPreorderTraversal.cpp)|Hard|
|
||||
|
@ -0,0 +1,87 @@
|
||||
// Source : https://leetcode.com/problems/greatest-common-divisor-of-strings/
|
||||
// Author : Hao Chen
|
||||
// Date : 2020-07-19
|
||||
|
||||
/*****************************************************************************************************
|
||||
*
|
||||
* For strings S and T, we say "T divides S" if and only if S = T + ... + T (T concatenated with
|
||||
* itself 1 or more times)
|
||||
*
|
||||
* Return the largest string X such that X divides str1 and X divides str2.
|
||||
*
|
||||
* Example 1:
|
||||
*
|
||||
* Input: str1 = "ABCABC", str2 = "ABC"
|
||||
* Output: "ABC"
|
||||
*
|
||||
* Example 2:
|
||||
*
|
||||
* Input: str1 = "ABABAB", str2 = "ABAB"
|
||||
* Output: "AB"
|
||||
*
|
||||
* Example 3:
|
||||
*
|
||||
* Input: str1 = "LEET", str2 = "CODE"
|
||||
* Output: ""
|
||||
*
|
||||
* Note:
|
||||
*
|
||||
* 1 <= str1.length <= 1000
|
||||
* 1 <= str2.length <= 1000
|
||||
* str1[i] and str2[i] are English uppercase letters.
|
||||
******************************************************************************************************/
|
||||
|
||||
class Solution {
|
||||
private:
|
||||
|
||||
|
||||
// Euclidean algorithm
|
||||
// https://en.wikipedia.org/wiki/Euclidean_algorithm
|
||||
// recursive way
|
||||
int findGCD_r(int a, int b) {
|
||||
if (a == 0)
|
||||
return b;
|
||||
return gcd(b % a, a);
|
||||
}
|
||||
// non-recursive way
|
||||
int findGCD(int a, int b) {
|
||||
int t = 1;
|
||||
while(t != 0) {
|
||||
t = a % b;
|
||||
a = b;
|
||||
b = t;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
bool isStrRepeatByLen(string& s, int len) {
|
||||
if (s.size() == len) return true;
|
||||
if (s.size() % len != 0 ) return false;
|
||||
for (int l=0; l<len; l++) {
|
||||
for (int i=1; i<s.size()/len; i++) {
|
||||
if (s[l] != s[i*len+l]) return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool strPrefixComp(string& s1, string &s2, int len){
|
||||
for(int i=0; i<len; i++) {
|
||||
if (s1[i] != s2[i]) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public:
|
||||
string gcdOfStrings(string s1, string s2) {
|
||||
|
||||
int gcd = findGCD(s1.size(), s2.size());
|
||||
|
||||
if (strPrefixComp(s1, s2, gcd) &&
|
||||
isStrRepeatByLen(s1, gcd)&&
|
||||
isStrRepeatByLen(s2, gcd) ){
|
||||
return s2.substr(0,gcd);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user