### 170小C的数字问题

62 阅读2分钟

问题描述

小S有一个由字符 'U' 和 'C' 组成的字符串 SS,并希望在编辑距离不超过给定值 mm 的条件下,尽可能多地在字符串中找到 "UCC" 子串。

编辑距离定义为将字符串 SS 转化为其他字符串时所需的最少编辑操作次数。允许的每次编辑操作是插入、删除或替换单个字符。你需要计算在给定的编辑距离限制 mm 下,能够包含最多 "UCC" 子串的字符串可能包含多少个这样的子串。

例如,对于字符串"UCUUCCCCC"和编辑距离限制m = 3,可以通过编辑字符串生成最多包含3个"UCC"子串的序列。

约束条件:

  • 字符串长度不超过1000
def solution(a: int, b: int, c: int, l: int, r: int) -> int:
    # 计算区间 [l, r] 内 a 的倍数的个数
    count_a = (r // a) - ((l - 1) // a)
    
    # 计算区间 [l, r] 内 b 的倍数的个数
    count_b = (r // b) - ((l - 1) // b)
    
    # 计算区间 [l, r] 内 c 的倍数的个数
    count_c = (r // c) - ((l - 1) // c)
    
    # 计算 a 和 b 的公倍数的个数
    lcm_ab = lcm(a, b)
    count_ab = (r // lcm_ab) - ((l - 1) // lcm_ab)
    
    # 计算 a 和 c 的公倍数的个数
    lcm_ac = lcm(a, c)
    count_ac = (r // lcm_ac) - ((l - 1) // lcm_ac)
    
    # 计算 b 和 c 的公倍数的个数
    lcm_bc = lcm(b, c)
    count_bc = (r // lcm_bc) - ((l - 1) // lcm_bc)
    
    # 计算 a、b 和 c 的公倍数的个数
    lcm_abc = lcm(lcm_ab, c)
    count_abc = (r // lcm_abc) - ((l - 1) // lcm_abc)
    
    # 使用容斥原理计算总数
    result = count_a + count_b + count_c - count_ab - count_ac - count_bc + count_abc
    
    return result

# 计算最小公倍数
def lcm(x, y):
    return x * y // gcd(x, y)

# 计算最大公约数
def gcd(x, y):
    while y:
        x, y = y, x % y
    return x

if __name__ == "__main__":
    print(solution(2, 3, 4, 1, 10) == 7)
    print(solution(5, 7, 11, 15, 100) == 34)
    print(solution(1, 1, 1, 1, 1000) == 1000)