Overflow in intermediate arithmetic
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.
Build confidence with an intuition-first walkthrough focused on math fundamentals.
For two strings s and t, we say "t divides s" if and only if s = t + t + t + ... + t + t (i.e., t is concatenated with itself one or more times).
Given two strings str1 and str2, return the largest string x such that x divides both str1 and 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: ""
Example 4:
Input: str1 = "AAAAAB", str2 = "AAA"
Output: ""
Constraints:
1 <= str1.length, str2.length <= 1000str1 and str2 consist of English uppercase letters.Problem summary: For two strings s and t, we say "t divides s" if and only if s = t + t + t + ... + t + t (i.e., t is concatenated with itself one or more times). Given two strings str1 and str2, return the largest string x such that x divides both str1 and str2.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Math
"ABCABC" "ABC"
"ABABAB" "ABAB"
"LEET" "CODE"
find-greatest-common-divisor-of-array)smallest-even-multiple)find-the-maximum-factor-score-of-array)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1071: Greatest Common Divisor of Strings
class Solution {
public String gcdOfStrings(String str1, String str2) {
if (!(str1 + str2).equals(str2 + str1)) {
return "";
}
int len = gcd(str1.length(), str2.length());
return str1.substring(0, len);
}
private int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
}
// Accepted solution for LeetCode #1071: Greatest Common Divisor of Strings
func gcdOfStrings(str1 string, str2 string) string {
if str1+str2 != str2+str1 {
return ""
}
n := gcd(len(str1), len(str2))
return str1[:n]
}
func gcd(a, b int) int {
if b == 0 {
return a
}
return gcd(b, a%b)
}
# Accepted solution for LeetCode #1071: Greatest Common Divisor of Strings
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
def check(a, b):
c = ""
while len(c) < len(b):
c += a
return c == b
for i in range(min(len(str1), len(str2)), 0, -1):
t = str1[:i]
if check(t, str1) and check(t, str2):
return t
return ''
// Accepted solution for LeetCode #1071: Greatest Common Divisor of Strings
impl Solution {
pub fn gcd_of_strings(str1: String, str2: String) -> String {
if str1.clone() + &str2 != str2.clone() + &str1 {
return String::from("");
}
fn gcd(a: usize, b: usize) -> usize {
if b == 0 {
return a;
}
gcd(b, a % b)
}
let (m, n) = (str1.len().max(str2.len()), str1.len().min(str2.len()));
str1[..gcd(m, n)].to_string()
}
}
// Accepted solution for LeetCode #1071: Greatest Common Divisor of Strings
function gcdOfStrings(str1: string, str2: string): string {
let [len1, len2] = [str1.length, str2.length];
function isDivisor(l: number): boolean {
if (len1 % l || len2 % l) {
return false;
}
let [f1, f2] = [Math.floor(len1 / l), Math.floor(len2 / l)];
return (
str1.slice(0, l).repeat(f1) == str1 &&
str1.slice(0, l).repeat(f2) == str2
);
}
for (let l = Math.min(len1, len2); l > 0; l--) {
if (isDivisor(l)) {
return str1.slice(0, l);
}
}
return '';
}
Use this to step through a reusable interview workflow for this problem.
Simulate the process step by step — multiply n times, check each number up to n, or iterate through all possibilities. Each step is O(1), but doing it n times gives O(n). No extra space needed since we just track running state.
Math problems often have a closed-form or O(log n) solution hidden behind an O(n) simulation. Modular arithmetic, fast exponentiation (repeated squaring), GCD (Euclidean algorithm), and number theory properties can dramatically reduce complexity.
Review these before coding to avoid predictable interview regressions.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.