📜  算法测验| SP2竞赛1 |问题18(1)

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

算法测验 | SP2竞赛1 | 问题18

简介

这是 SP2 竞赛中的第 18 个问题,需要能够处理字符串和算法问题的程序员来解决。该问题需要设计一个算法,能够快速地检查一个字符串是否符合某些特定规则。

问题描述

给定一个只包含小写字母和数字的字符串,判断该字符串是否符合如下规则:

  1. 字符串长度必须是 32 个字符;
  2. 字符串中必须包含且仅包含 16 个小写字母和 16 个数字;
  3. 字符串中不能包含任何连续的 3 个或以上相同的字符(例如,"aabbcc" 和 "11jjj22" 都不符合该规则);
  4. 字符串中不能包含任何连续的 3 个或以上字符,它们的数字或小写字母位于相邻的位置上(例如,"a1b2c3d4" 和 "1e2f3g4h" 都不符合该规则)。

如果字符串符合上述规则,则输出 "Yes",否则输出 "No"。

解题思路

该问题需要同时检查字符串的长度、字符种类、连续字符和连续数字的规则。我们可以依次检查每个规则,如果某个规则不满足,则直接输出 "No"。若所有规则都满足,则输出 "Yes"。

对于第 1 个规则,我们只需检查字符串的长度是否为 32 即可。对于第 2 个规则,我们可以使用正则表达式来检查字符串是否仅包含 16 个小写字母和 16 个数字:

import re

if not re.match(r'^[a-z\d]{32}$', s):
    print('No')
    return

对于第 3 和第 4 个规则,我们可以遍历字符串,维护两个计数器,一个用来统计连续字符的长度,另一个用来统计相邻字符位于不同种类中的长度。如果某个计数器的值超过了 2,则直接输出 "No"。

count = 1
last_char = s[0]
for i in range(1, len(s)):
    if s[i] == last_char:
        count += 1
        if count > 2:
            print('No')
            return
    else:
        count = 1
        if i > 1 and s[i].isdigit() == s[i - 2].isdigit():
            print('No')
            return
        if i > 2 and s[i] == s[i - 2] == s[i - 3]:
            print('No')
            return
    last_char = s[i]
完整代码
import re

s = input()

# Check length
if len(s) != 32:
    print('No')
    exit()

# Check character types
if not re.match(r'^[a-z\d]{32}$', s):
    print('No')
    exit()

# Check consecutive characters and digits
count = 1
last_char = s[0]
for i in range(1, len(s)):
    if s[i] == last_char:
        count += 1
        if count > 2:
            print('No')
            exit()
    else:
        count = 1
        if i > 1 and s[i] == s[i - 2] == s[i - 3]:
            print('No')
            exit()
        if i > 2 and s[i].isdigit() == s[i - 2].isdigit():
            print('No')
            exit()
    last_char = s[i]

# Passed all rules
print('Yes')