解决leetcode第3777题使子字符串变交替的最少删除次数

3777.使子字符串变交替的最少删除次数

难度:困难

问题描述:

给你一个长度为n的字符串s,其中仅包含字符'A'和'B'。

你还获得了一个长度为q的二维整数数组queries,其中每个queriesi是以下形式之一:

1,j:反转s中下标为j的字符,即'A'变为'B'(反之亦然)。此操作会修改s并影响后续查询。

2,l,r:计算使子字符串sl..r变成交替字符串所需的最小字符删除数。此操作不会修改s;s的长度保持为n。

如果子字符串中不存在两个相邻字符相等的情况,则该子字符串是交替字符串。长度为1的子字符串始终是交替字符串。

返回一个整数数组answer,其中answeri是第i个类型为2,l,r的查询的结果。

子字符串是字符串中一段连续的非空字符序列。

示例1:

输入:s="ABA",queries=\[2,1,2,1,1,2,0,2]

输出:0,2

解释:

i queriesi j l r 查询前的s sl..r 结果 答案

0 2,1,2 - 1 2 "ABA" "BA" 已经是交替字符串 0

1 1,1 1 - - "ABA" - 将s1从'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 queriesi j l r 查询前的s sl..r 结果 答案

0 2,0,2 - 0 2 "ABB" "ABB" 删除一个'B'以得到"AB" 1

1 1,2 2 - - "ABB" - 将s2从'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 queriesi j l r 查询前的s sl..r 结果 答案

0 2,0,3 - 0 3 "BABA" "BABA" 已经是交替字符串 0

1 1,1 1 - - "BABA" - 将s1从'A'反转为'B' -

2 2,1,3 - 1 3 "BBBA" "BBA" 删除一个'B'以得到"BA" 1

因此,答案是0,1

提示:

1<=n==s.length<=105

si要么是'A',要么是'B'。

1<=q==queries.length<=105

queriesi.length==2或3

queriesi==1,j

queriesi==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

相关推荐
203号居民3 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
张龙6874 小时前
uv 全面指南:比 pip 快 100 倍的 Python 包管理器,从安装到团队落地
后端·python
@HNUSTer4 小时前
Python数据可视化科技图表绘制系列教程(八)
python·数据可视化·科技论文·专业制图·科研图表
专注仿真5 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
满怀冰雪6 小时前
22-使用 PaddleClas 快速训练图像分类模型
人工智能·python·机器学习·分类·数据挖掘·paddlepaddle
gb42152876 小时前
python中Web应用服务器
开发语言·前端·python
地平线开发者6 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠6 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc
2401_862880826 小时前
数据结构 --- 栈
c语言·数据结构·算法
致Great7 小时前
Qwen3.8-27B 接入 DSH 全流程实测:写代码、跑长任务,都没问题
算法