📌  相关文章
📜  子串数可被8整除但不能被3整除(1)

📅  最后修改于: 2023-12-03 15:39:01.228000             🧑  作者: Mango

子串数可被8整除但不能被3整除

在字符串处理中,有时需要判断一个字符串中子串的数量是否满足一些条件。本文介绍如何判断一个字符串中子串数可被8整除但不能被3整除。

方法1:暴力枚举

最简单粗暴的方法是枚举所有的子串,并计数。具体实现过程如下:

def check_string(s: str) -> bool:
    cnt = 0
    for i in range(len(s)):
        for j in range(i+1, len(s)+1):
            if int(s[i:j]) % 8 == 0 and int(s[i:j]) % 3 != 0:
                cnt += 1
    return cnt % 8 == 0 and cnt % 3 != 0

该方法的时间复杂度为$O(n^3)$,对于长度较长的字符串,会超时或超出内存限制。

方法2:利用8的倍数的性质

一个数可被8整除的充要条件是其后三位组成的数可被8整除。为了判断一个子串可被8整除,仅需判断其后三位组成的数可否被8整除。根据同余的相关性质,将“不能被3整除”转化为“余数不为0或1”。基于以上分析,可以得到以下实现:

def check_string(s: str) -> bool:
    cnt = [0] * 8
    for i in range(len(s)-2):
        if int(s[i:i+3]) % 8 == 0:
            cnt[0] += 1
        elif int(s[i:i+3]) % 8 % 3 != 0:
            cnt[int(s[i:i+3]) % 8] += 1
    for i in range(1, 8, 2):
        for j in range(cnt[i]):
            for k in range(j+1, cnt[i]):
                if (i+j+k) % 3 != 0:
                    return True
    if cnt[0] > 0:
        return cnt[0] % 8 == 0
    else:
        return False

该方法的时间复杂度为$O(n)$,运行速度快,适用于大规模数据处理。

总结

本文介绍了两种方法用于判断一个字符串中子串数可被8整除但不能被3整除。实际应用中应根据具体场景选择合适的方法。