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(n2, i) * d[i]
num2 = Σ C(n2, 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