3777.使子字符串变交替的最少删除次数
难度:困难
问题描述:
给你一个长度为n的字符串s,其中仅包含字符'A'和'B'。
你还获得了一个长度为q的二维整数数组queries,其中每个queries[i]是以下形式之一:
1,j\]:反转s中下标为j的字符,即'A'变为'B'(反之亦然)。此操作会修改s并影响后续查询。 \[2,l,r\]:计算使子字符串s\[l..r\]变成交替字符串所需的最小字符删除数。此操作不会修改s;s的长度保持为n。 如果子字符串中不存在两个相邻字符相等的情况,则该子字符串是交替字符串。长度为1的子字符串始终是交替字符串。 返回一个整数数组answer,其中answer\[i\]是第i个类型为\[2,l,r\]的查询的结果。 子字符串是字符串中一段连续的非空字符序列。 示例1: 输入:s="ABA",queries=\[\[2,1,2\],\[1,1\],\[2,0,2\]
输出:[0,2]
解释:
i queries[i] j l r 查询前的s s[l..r] 结果 答案
0 [2,1,2] - 1 2 "ABA" "BA" 已经是交替字符串 0
1 [1,1] 1 - - "ABA" - 将s[1]从'B'反转为'A' -
2 [2,0,2] - 0 2 "AAA" "AAA" 删除任意两个'A'以得到"A" 2
因此,答案是[0,2]。
示例2:
输入:s="ABB",queries=[[2,0,2],[1,2],[2,0,2]]
输出:[1,0]
解释:
i queries[i] j l r 查询前的s s[l..r] 结果 答案
0 [2,0,2] - 0 2 "ABB" "ABB" 删除一个'B'以得到"AB" 1
1 [1,2] 2 - - "ABB" - 将s[2]从'B'反转为'A' -
2 [2,0,2] - 0 2 "ABA" "ABA" 已经是交替字符串 0
因此,答案是[1,0]。
示例3:
输入:s="BABA",queries=[[2,0,3],[1,1],[2,1,3]]
输出:[0,1]
解释:
i queries[i] j l r 查询前的s s[l..r] 结果 答案
0 [2,0,3] - 0 3 "BABA" "BABA" 已经是交替字符串 0
1 [1,1] 1 - - "BABA" - 将s[1]从'A'反转为'B' -
2 [2,1,3] - 1 3 "BBBA" "BBA" 删除一个'B'以得到"BA" 1
因此,答案是[0,1]。
提示:
1<=n==s.length<=105
s[i]要么是'A',要么是'B'。
1<=q==queries.length<=105
queries[i].length==2或3
queries[i]==[1,j]或
queries[i]==[2,l,r]
0<=j<=n-1
0<=l<=r<=n-1
问题分析:
本问题要解决两个小问题,分别用到两个函数,一是函数get_min_numbers_of_deletions(s),其功能是检测一个字符串s是否为交替字符串,并返回将其变成交替字符串所需要删除字符的最少次数,如果已经是一个交替字符串,则返回0。二是函数result_according_to_the_query(queries,s),其功能是根据查询queries中的每一次查询,对原字符串s进行相应处理,并返回处理之后对应结果。
程序如下:
python
#检查一个字符串是否为交替字符串,并返回最少删除次数
def get_min_numbers_of_deletions(s):
c=0
t=s[0]
n=len(s)
for i in range(1,n):
if s[i]==t:
c+=1
else:
t=s[i]
return c
#根据查询对原字符串s进行处理,返回处理之后得到的结果
def result_according_to_the_query(queries,s):
d=[]
for i in queries:
t=0
if i[0]==2:
start=i[1]
end=i[2]+1
a=s[start:end]
t+=get_min_numbers_of_deletions(a)
else:
c=s[i[1]]
b='B' if c=='A' else 'A'
left=s[:i[1]]
right=s[i[1]+1:]
s=left+b+right
continue
d.append(t)
return d
#主程序
s=input('pls input s=')
queries=eval(input('pls input queries='))
print(result_according_to_the_query(queries,s))
运行实例一
pls input s=ABABAAB
pls input queries=[[2,0,5],[1,4],[2,0,5]]
1, 1
运行实例二
pls input s=ABAA
pls input queries=[[2,1,2],[1,3],[2,0,3]]
0, 0