描述:
密码要求: 1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)

数据范围:输入的字符串长度满足 1≤n≤100
输入描述:一组字符串。
输出描述:如果符合要求输出:OK,否则输出NG

示例1
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出:
OK
NG
NG
OK

def CheckPassword(strs:str) -> bool:
    if len(strs) < 8:    # 长度小于8,密码不合理
        return False
    
    ListSub = []
    for i in range(len(strs)-2):
        ListSub.append(strs[i:i+3])        # 以3个长度为子串进行切割,确认是否有重复子串;如果4个有重复,3个肯定也有重复
    if len(set(ListSub)) != len(ListSub):    # 集合会去重,如果集合和列表的长度不一致,说明有重复子串,密码不合理
        return False
    
    arrIndex = []       # arrIndex是保证数字/大写字母/小写字母/其他字符只统计一次
    arrCount = 0        # 统计出现字符的种类,除
    for x in strs:
        if x.isdigit() and ("num" not in arrIndex): 
            arrIndex.append("num")
            arrCount += 1
        elif x.islower() and ("lower" not in arrIndex):
            arrIndex.append("lower")
            arrCount += 1
        elif x.isupper() and ("upper" not in arrIndex):
            arrIndex.append("upper")
            arrCount += 1
        elif not x.isdigit() and not  x.islower() and not x.isupper() and x not in arrIndex:    # 其他字母,可能有不同种类,要单独统计
            arrIndex.append(x)
            arrCount += 1
    if arrCount >=3:    # 如果字符种类超过3种,则符合预期;负责不符合预期
        return True
    return False

while True:        # 因为题目涉及多次输入,所以需要一个死循环
    try:
        InputStr = input()
        print("OK" if CheckPassword(InputStr) else "NG")
    except:
        break