1. 问题描述:
给定一个由 n 个小写字母构成的字符串。现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x。请问,最少需要删掉多少个字母?如果字符串本来就不存在连续的三个或三个以上 x,则无需删掉任何字母。
输入格式
第一行包含整数 n。第二行包含一个长度为 n 的由小写字母构成的字符串。
输出格式
输出最少需要删掉的字母个数。
数据范围
3 ≤ n ≤ 100
输入样例1:
6
xxxiii
输出样例1:
1
输入样例2:
5
xxoxx
输出样例2:
0
输入样例3:
10
xxxxxxxxxx
输出样例3:
8
来源:https://www.acwing.com/problem/content/description/3771/
2. 思路分析:
分析题目可以知道我们需要找到连续的一段"x",而找到连续相等的区间则可以使用双指针算法来解决,一个指针i从前往后扫描,当发现其中一个字符为"x"的时候,另外一个指针j从下一个位置开始扫描,直到找到结束的位置那么[i,j - 1]就是连续一段"x"的区间,累加上需要删除的字符的个数即可。
3. 代码如下:
class Solution:
def process(self):
n = int(input())
s = input()
i = res = 0
while i < n:
if s[i] == "x":
# 双指针算法找到连续的一段x
j = i + 1
while j < n and s[j] == "x": j += 1
# 当前位置j的字符不等于x, 删除的字符必须大于等于1所以要与0取一个max
res += max(0, j - i - 2)
i = j - 1
i += 1
return res
if __name__ == '__main__':
print(Solution().process())