A25648. ABB字符串提示信息:ABB 形式的字符串:是由 3 个字符组成,其中后两个字符相同,第一个字符与后两个字符不同。如:"cbb"、"q22"、"688" 都是 ABB 形式的字符串;"abc"、"wwe"、"pop" 都不是 ABB 形式的字符串。子串:是指一个字符串中连续的一段字符序列。如:字符串 "HelloWorld!" 中,"Hello"、"ello"、"World"、"or" 都是该字…
题目描述
ABB字符串
提示信息:
ABB 形式的字符串:是由 3 个字符组成,其中后两个字符相同,第一个字符与后两个字符不同。
如:"cbb"、"q22"、"688" 都是 ABB 形式的字符串;"abc"、"wwe"、"pop" 都不是 ABB 形式的字符串。
子串:是指一个字符串中连续的一段字符序列。
如:字符串 "HelloWorld!" 中,"Hello"、"ello"、"World"、"or" 都是该字符串的子串。
编程实现
给定一个字符串 S,请统计 S 中有多少个 ABB 形式的子串,以及多少种 ABB 形式的子串。
例如:S = "nnnseebbetoosee",ABB 形式的子串有 see、ebb、too、see,共 4 个;ABB 形式的不同子串有 see、ebb、too,共 3 种。
输入描述
输入一个长度不超过 100 的字符串 S
输出描述
输出两个整数,分别表示 S 中有多少个 ABB 形式的子串,以及多少种 ABB 形式的子串,整数之间以一个空格隔开
样例输入
nnnseebbetoosee样例输出
4 3参考答案
s = input().strip()
total_count = 0
unique_set = set()
for i in range(len(s) - 2):
# 检查后两个字符是否相同,且第一个字符不同
if s[i+1] == s[i+2] and s[i] != s[i+1]:
substr = s[i:i+3]
total_count += 1
unique_set.add(substr)
print(f"{total_count} {len(unique_set)}")答案解析
输入处理:读取字符串并去除首尾空格
初始化计数器:
total_count:统计所有ABB子串数量
unique_set:存储不同子串(自动去重)
遍历检查:
循环范围:0 到 len(s)-3(确保能取到长度为3的子串)
检查条件:s[i+1] == s[i+2] and s[i] != s[i+1]
结果统计:
符合条件的子串加入计数器
子串加入集合(自动去重)
输出结果:ABB子串总数和不同子串种类数
样例验证:
输入:"nnnseebbetoosee"
处理过程:
位置3:"see" → 符合(计数+1,集合添加"see")
位置5:"ebb" → 符合(计数+1,集合添加"ebb")
位置9:"too" → 符合(计数+1,集合添加"too")
位置12:"see" → 符合(计数+1,集合已存在"see"不添加)
输出:4 3(总数4,种类3),符合样例要求
此方案时间复杂度为O(n),空间复杂度O(m)(m为不同子串数量),高效满足题目要求。