本次博客我是通过Notion软件写的,转md文件可能不太美观,大家可以去我的博客中查看:北天的 BLOG,持续更新中,另外这是我创建的编程学习小组频道,想一起学习的朋友可以一起!!!
现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x
。
请问,最少需要删掉多少个字母?
如果字符串本来就不存在连续的三个或三个以上 x
,则无需删掉任何字母。
输入格式
第一行包含整数 n n n。
第二行包含一个长度为 n n n 的由小写字母构成的字符串。
输出格式
输出最少需要删掉的字母个数。
数据范围
3 ≤ n ≤ 100 3≤n≤100 3≤n≤100
输入样例1:
6
xxxiii
输出样例1:
1
输入样例2:
5
xxoxx
输出样例2:
0
输入样例3:
10
xxxxxxxxxx
输出样例3:
8
暴力枚举法:
我们可以通过枚举所有长度为3的子串,判断是否为 ‘xxx’,从而找到需要删除的字符数量。具体实现方法是从下标2开始,每次取出以该下标为结尾的长度为3的子串,判断是否为 ‘xxx’,如果是,就需要删除中间那个字符,即下标为i-1的字符。最后统计需要删除的字符数量即可。暴力枚举法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
双指针法:
我们可以通过维护两个指针 i 和 j,其中 i 指向当前处理的字符,j 指向最近一个不需要删除的字符。具体实现方法是遍历整个字符串,如果当前字符为 ‘x’,就将 cnt 加 1,如果 cnt 等于 3,说明需要删除当前字符,即将 res 加 1,如果 cnt 大于 3,说明当前字符需要删除,但是删除后会导致字符串中存在连续三个 ‘x’,因此需要将 j 后移一位,即将 j 赋值为 i-1,同时将 cnt 减 1,这样可以保证删除当前字符后,字符串中不存在连续三个 ‘x’。如果当前字符不为 ‘x’,则将 cnt 置为 0,j 赋值为 i。最后统计需要删除的字符数量即可。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
总体而言,双指针法的效率更高,因为其只需要遍历一遍字符串,而暴力枚举法需要枚举所有长度为 3 的子串,效率相对较低。
n = int(input())
st = input()
c = 0
# 枚举所有长度为 3 的子串
for i in range(2, n):
# 判断是否为 'xxx'
if st[i - 2:i + 1] == 'xxx':
# 如果是,则需要删除中间那个字符,即下标为 i-1 的字符
c += 1
# 输出需要删除的字符数量
print(c)
双指针法代码实现:
n = int(input())
s = input()
res, cnt = 0, 0
j = -1
# 遍历整个字符串
for i in range(n):
# 如果当前字符为 'x'
if s[i] == "x":
# 将 cnt 加 1
cnt += 1
# 如果 cnt 等于 3,说明需要删除当前字符
if cnt == 3:
# 将 res 加 1
res += 1
# 如果 cnt 大于 3,说明当前字符需要删除,
# 但是删除后会导致字符串中存在连续三个 'x',
# 因此需要将 j 后移一位,即将 j 赋值为 i-1,
# 同时将 cnt 减 1,这样可以保证删除当前字符后,
# 字符串中不存在连续三个 'x'
elif cnt > 3:
res += 1
cnt -= 1
j += 1
else:
# 如果当前字符不为 'x',将 cnt 置为 0,j 赋值为 i
cnt = 0
j = i
# 输出需要删除的字符数量
print(res)