Daily Leetcode - Check If Digits Are Equal in String After Operations I
1. Thinking Process
1.1. Modular Formula
(a + b) mod m = ((a mod m) + (b mod m)) mod m
1.2. Algebraic Proof
1.3. O(N^2) Solution
- Idea: Calculate each array while loops until the result is 2 digits.
def areDigitsEqual_naive(s: str) -> bool:
digits = [int(ch) for ch in s]
while len(digits) > 2:
new_digits = []
for i in range(len(digits) - 1):
new_digits.append((digits[i] + digits[i + 1]) % 10)
digits = new_digits
return digits[0] == digits[1]
1.4. O(N) Solution
num1 = Σ C(n−2, i) * d[i]
num2 = Σ C(n−2, i) * d[i+1]
=> N = C(k, 0)d1 + C(k, 1)d2 + … + C(k, k)dn
def areDigitsEqual_optimized(s: str) -> bool:
n = len(s)
digits = [int(ch) for ch in s]
num1, num2 = 0, 0
comb = 1 # C(n-2, 0)
for i in range(n - 1):
num1 = (num1 + comb * digits[i]) % 10
num2 = (num2 + comb * digits[i + 1]) % 10
# next binomial coefficient: C(k, i+1) = C(k, i) * (k - i) / (i + 1)
comb = comb * (n - 2 - i) // (i + 1)
return num1 == num2
(a + b) mod m = ((a mod m) + (b mod m)) mod m
= (sum all)mod m
class Solution:
def hasSameDigits(self, s: str) -> bool:
n = len(s)
digits = [int(ch) for ch in s]
def comb_mod10(n, k):
# compute C(n, k) % 10 iteratively (no factorial)
res = 1
for i in range(1, k + 1):
res = res * (n - i + 1) // i
return res % 10
num1 = num2 = 0
for i in range(n - 1):
c = comb_mod10(n - 2, i)
num1 = (num1 + c * digits[i]) % 10
num2 = (num2 + c * digits[i + 1]) % 10
return num1 == num2
1.5. Why num1 from [0, n -2] and num2 from [1, n - 1]
- [d0, d1, d2, d3] → [d0+d1, d1+d2, d2+d3] → … After n−2 operations, we’ll have 2 digits left.
=> num1, num2
Last Updated On October 23, 2025