Python | 蓝桥杯进阶第一卷——字符串
欢迎交流学习~~
专栏: 蓝桥杯Python组刷题日寄
蓝桥杯进阶系列:
🏆 Python | 蓝桥杯进阶第一卷——字符串
🔎 Python | 蓝桥杯进阶第二卷——递归(待续)
💝 Python | 蓝桥杯进阶第三卷——动态规划(待续)
✈️ Python | 蓝桥杯进阶第四卷——图论(待续)
🌞 Python | 蓝桥杯进阶第五卷——数论(待续)
🌠 Python | 蓝桥杯进阶第六卷——贪心(待续)
💎 Python | 蓝桥杯进阶第七卷——搜索(待续)
Python | 蓝桥杯进阶第一卷——字符串
- 🎁 字符串的修改
- 🌲 ISBN码
- 🚀 完美的代价
- 💡 字符串的展开
- 🍞 正则问题
🎁 字符串的修改
时间限制:
1s
内存限制:
128MB
题目描述:
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
- 删除一个字符;
- 插入一个字符;
- 将一个字符改为另一个字符。
对任给的两个字符串 A
和 B
,计算出将字符串 A
变换为字符串 B
所用的最少字符操作次数。
输入描述:
第一行为字符串 A
;第二行为字符串 B
;字符串 A
和 B
的长度均小于 200
。
输出描述:
只有一个正整数,为最少字符操作次数。
样例输入:
sfdxbqw
gfdgw
样例输出:
4
解题思路
本题思路如下:
- 求解两字符串的最长公共子序列,得到其长度
L
; - 计算最少字符操作次数
本题思路的核心在于 求解两个字符串的最长公共子序列。
可以选择用循环暴力求解,但是时间复杂度过高,容易超时。因此我们这里可以选用时间复杂度更低的动态规划方法:
dp[i][j]
表示a[:i-1]
和b[:j-1]
的最长公共子序列的长度i>0, j>0
,对应dp
数组的大小为dp[l1+1][l2+1]
,l1
和l2
为两个字符串的长度;i=0
或j=0
表示空字符串,此时公共子序列长度都为0
,因此我们将dp
数组都初始化为0
;- 状态转移具体见代码。
而对于计算最终结果,其计算方式为:max(l1, l2) - L
。
因为,如果想将较长的字符串变为较短的字符串,除了最长公共子序列,其余字符都需要变化。
参考代码
a = input()
b = input()
l1 = len(a)
l2 = len(b)
# dp数组,
# dp[i][j]表示a[:i-1]和b[:j-1]中最长公共子序列的长度(i>0, j>0)
# i=0 和 j=0 表示空字符串,初始化dp数组为全0
dp = [[0 for j in range(l2 + 1)] for i in range(l1 + 1)]
for i in range(1, l1+1):for j in range(1, l2+1):if a[i-1] == b[j-1]:# a的第i-1个字符和b的第j-1个字符相同dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])res = max(l1, l2) - dp[-1][-1]
print(res)
🌲 ISBN码
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括 9
位数字、1
位识别码和 3
位分隔符,其规定格式如 x-xxx-xxxxx-x
,其中符号 -
就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4
就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如 0
代表英语;第一个分隔符 -
之后的三位数字代表出版社,例如 670
代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以 1
加上次位数字乘以 2
……以此类推,用所得的结果 mod 11
,所得的余数即为识别码,如果余数为 10
,则识别码为大写字母 X
。例如ISBN号码 0-670-82162-4
中的识别码 4
是这样得到的:对 067082162
这 9
个数字,从左至右,分别乘以1,2,...,9
,再求和,即 0×1+6×2+……+2×9=158
,然后取158 mod 11
的结果 4
作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出 Right
;如果错误,则输出你认为是正确的ISBN号码。
输入描述:
输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出描述:
输出共一行,假如输入的ISBN号码的识别码正确,那么输出 Right
,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符 -
)。
样例输入:
0-670-82162-4
0-670-82162-0
样例输出:
Right
0-670-82162-4
解题思路
本题思路比较简单,注意细节的处理:
- 字符串以
-
分割; - 当计算出的识别码为
10
时,将其转换为X
;
参考代码
while True:try:raw = input()s = ''.join(raw.split('-'))id = 0for i in range(len(s)-1):id += int(s[i]) * (i + 1)id %= 11id = str(id)if id == '10':id = 'X'if id == s[-1]:print('Right')else:print(raw[:-1] + id)except:break
🚀 完美的代价
时间限制:
1s
内存限制:
128MB
题目描述:
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如:对于 mamad
:
第一次交换 ad
: mamda
第二次交换 md
: madma
第三次交换 ma
: madam
(回文!完美!)
输入描述:
第一行是一个整数 N
,表示接下来的字符串的长度(N < = 8000)
第二行是一个字符串,长度为 N
,只包含小写字母
输出描述:
如果可能,输出最少的交换次数。
否则输出 Impossible
样例输入:
5
mamad
样例输出:
3
解题思路
本题利用双指针,其中头指针 head
从前向后遍历,尾指针 tail
从后向前遍历。
退出循环的条件:
- 字符串长度为偶数,但是有频数为奇数的字母
- 字符串长度为奇数,但是有多于
1
个的频数为奇数的字母
具体思路见参考代码。
参考代码
n = int(input())
s = list(input())
count = 0 # 记录交换次数
flag = 0 # 标记是否有字母频数为奇数
res = True # 标记是否为Impossible(是Impossible置为False)# 双指针
L = n - 1 # 头指针搜索范围,到倒数第2个
for head in range(L):# 对于每一个s[head],用尾指针去搜索是否有相同的字母s[tail]for tail in range(L, head - 1, -1):# 指针tail搜索完毕,没有发现s[head] == s[tail]# 说明该字母频数为奇数 1,且该字母在回文序列中一定在中间if head == tail:# 如果字符串长度为偶数# 字符串长度为奇数,但是已经有 flag == 1if n%2 == 0 or flag == 1:res = Falsebreakflag = 1# (n//2 - head) 为将该字母移动到中间位置的交换次数count += n//2 - head# 发现了 s[head] == s[tail]elif s[head] == s[tail]:# 交换位置for i in range(tail, L):s[i], s[i+1] = s[i+1], s[i]count += 1L -= 1break# 如果是impossible,退出外层循环if res == False:breakif res == False:print('Impossible')
else:print(count)
💡 字符串的展开
时间限制:
1s
内存限制:
128MB
题目描述:
在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于 d-h
或者 4-8
的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为 defgh
和 45678
。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:
- 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号
-
,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。 - 参数
p1
:展开方式。p1=1
时,对于字母子串,填充小写字母;p1=2
时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3
时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号*
来填充。 - 参数
p2
:填充字符的重复个数。p2=k
表示同一个字符要连续填充k
个。例如,当p2=3
时,子串d-h
应扩展为deeefffgggh
。减号两边的字符不变。 - 参数
p3
:是否改为逆序:p3=1
表示维持原来顺序,p3=2
表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1
、p2=2
、p3=2
时,子串d-h
应扩展为dggffeeh
。 - 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:
d-e
应输出为de
,3-4
应输出为34
。如果减号右边的字符按照 ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:d-d
应输出为d-d
,3-1
应输出为3-1
。
输入描述:
输入包括两行:
第 1
行为用空格隔开的 3
个正整数,一次表示参数 p1
,p2
,p3
。
第 2
行为一行字符串,仅由数字、小写字母和减号 -
组成。行首和行末均无空格。
数据规模和约定
100%的数据满足:1<=p1<=3
,1<=p2<=8
,1<=p3<=2
。字符串长度不超过 100
输出描述:
输出只有一行,为展开后的字符串.
样例输入:
1 2 1
abcs-w1234-9s-4zz
样例输出:
abcsttuuvvw1234556677889s-4zz
解题思路
- 符号
-
只会在s[1:len(s)-1]
之间(s
为输入字符串),因此要在这个范围内遍历,找到符号-
并将其展开; - 满足展开的条件,即要判断左右两边的字符的ASCII码关系;
- 之后根据
p3->p1->p2
的判断顺序对展开字符进行修改。
具体见代码。
参考代码
p1, p2, p3 = map(int, input().split())
s = input()
res = s[0]
# '-' 只会在s[1:len(s)-1]中间,因此s的首尾不需要变化
for i in range(1, len(s)-1):left, mid, right = s[i-1], s[i], s[i+1]# 遇到 '-' 并且左右字符满足如下条件:# 条件1:left<right# 条件2:(left>='0' and right<='9') or (left>='a' and right<='z') if mid == '-' and left < right and ((left >= '0' and right <= '9') or (left >= 'a' and right <= 'z')):## 判断顺序:p3 -> p1 -> p2## p3if p3 == 1:# 顺序index_j = [j for j in range(ord(left)+1, ord(right))]else:# 逆序index_j = [j for j in range(ord(right)-1, ord(left), -1)]## p1for j in index_j:# chr()转为字符tmp = chr(j)if p1 == 2:# 变为大写tmp = tmp.upper()elif p1 == 3:# 变为 '*'tmp = '*'## p2# 重复 p2 次res += tmp * p2else:res += mid# 尾巴
res += s[-1]
print(res)
🍞 正则问题
时间限制:
1s
内存限制:
128MB
题目描述:
考虑一种简单的正则表达式:
只由 x ( ) |
组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如:((xx|xxx)x|(x|xx))xx
能接受的最长字符串是: xxxxxx
,长度是 6
。
输入描述:
一个由 x()|
组成的正则表达式。输入长度不超过 100
,保证合法。
输出描述:
这个正则表达式能接受的最长字符串的长度。
样例输入:
((xx|xxx)x|(x|xx))xx
样例输出:
6
解题思路
该问题是利用 深度优先遍历 的思想,具体实现见下面的参考代码。
这里我们以样例逐步说明算法原理,将参考代码进行简单修改,可以帮助我们理解在哪一层搜索:
# 测试代码
s = '((xx|xxx)x|(x|xx))xx'
i = 0
floor = 0
def dfs():global i, floorprint(f'此时: i = {i}')floor += 1print(f'进入一层,此时的层数为 {floor}')res = 0while i < len(s):# 遇到 '(',递归调用函数,对接下的 'x' 计数if s[i] == '(':i += 1res += dfs()i += 1print(f'此时: i = {i}')# 遇到 ')',返回计数结果elif s[i] == ')':floor -= 1print(f'退出一层,此时的层数为 {floor}')return res# 遇到 'x',计数+1,索引后移elif s[i] == 'x':i += 1print(f'此时: i = {i}')res += 1# 遇到 '|',返回左右两边的较大值elif s[i] == '|':i += 1res = max(res, dfs())return resdfs()
输出结果:
此时: i = 0
进入一层,此时的层数为 1
此时: i = 1
进入一层,此时的层数为 2
此时: i = 2
进入一层,此时的层数为 3
此时: i = 3
此时: i = 4
此时: i = 5
进入一层,此时的层数为 4
此时: i = 6
此时: i = 7
此时: i = 8
退出一层,此时的层数为 3
退出一层,此时的层数为 2
此时: i = 9
此时: i = 10
此时: i = 11
进入一层,此时的层数为 3
此时: i = 12
进入一层,此时的层数为 4
此时: i = 13
此时: i = 14
进入一层,此时的层数为 5
此时: i = 15
此时: i = 16
退出一层,此时的层数为 4
退出一层,此时的层数为 3
此时: i = 17
退出一层,此时的层数为 2
退出一层,此时的层数为 1
此时: i = 18
此时: i = 19
此时: i = 20
参考代码
s = list(input().strip())
i = 0def dfs():global ires = 0while i < len(s):# 遇到 '(',递归调用函数,对接下的 'x' 计数if s[i] == '(':i += 1res += dfs()i += 1# 遇到 ')',返回计数结果elif s[i] == ')':return res# 遇到 'x',计数+1,索引后移elif s[i] == 'x':i += 1res += 1# 遇到 '|',返回左右两边的较大值elif s[i] == '|':i += 1res = max(res, dfs())return resprint(dfs())
相关文章:

Python | 蓝桥杯进阶第一卷——字符串
欢迎交流学习~~ 专栏: 蓝桥杯Python组刷题日寄 蓝桥杯进阶系列: 🏆 Python | 蓝桥杯进阶第一卷——字符串 🔎 Python | 蓝桥杯进阶第二卷——递归(待续) 💝 Python | 蓝桥杯进阶第三卷——动态…...

2023-03-03 mysql列存储-cpu占用100%-追踪思路
摘要: 最近在处理mysql列存储时, 发现在执行explain时, cpu占用达到了100%. 本文分析定位该问题的思路过程 现象: mysqld进程占用100%使用kill processlist终止会话, 无响应查看show processings; 发现一直在运行mysql> show processlist; +----+-----------------+-----…...

JVM—类加载子系统
JVM细节版架构图 本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程 类加载子系统作用 1.类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识即16进制CA FE BA BE; 2.加载后的Class类信息…...
在codeIgniter3中session.php中的数组追加值
如果key是字符串时,输出什么值?会直接把atime()的时间戳添加到key是字符串时,输出什么值?会直接把atime()的时间戳添加到key是字符串时,输出什么值?会直接把atime()的时间戳添加到arr[‘vars’]数组里面&am…...

Windows环境下Gpu版本的Pytorch安装
文章目录安装步骤总览(6步)1 首先看电脑有没有显卡,显卡是否支持cuda软件1.1 先看自己电脑是否有显卡1.2 两种方法看自己的电脑的显卡驱动支持的CUDA1.3 显卡,显卡驱动、CUDA、CUDNN 4者说明2 安装CUDA,就是1个软件2.1 检测自己电…...

项目实战典型案例13——学情页面逻辑问题
学情页面逻辑问题一:背景介绍二:学情页面逻辑问题分析逻辑问题缓存滥用的问题三:LocalStorage基础知识数据结构特性应用场景localStorage常用方法四:总结升华一:背景介绍 本篇博客是对项目开发中出现的学情页面逻辑问…...

工作日志day02
1.云计算? 相关职位 开源软件和linux起源: 自由软件之父:理查德.斯托曼linux之父:林纳斯.本纳第克特.托瓦兹linux发行版 RHEL:Red Hat Enterprise Linux 红帽linux商业公司CentOS:Community Enterprise Operating Sys…...

C++Primer16.1.6节练习
练习16.28: 简易的shared_ptr代码如下 #include <iostream> #include <vector> #include <list> using namespace std;//shared_ptr模板 template<typename T>class SharedPtr {friend SharedPtr<T>& MakeShared(T* t); public…...
初尝并行编程
进程被分为后台进程和应用进程 大部分后台进程在系统开始运行时被操作系统启动,完成操作系统的基础服务功能。大部分应用进程由用户启动,完成用户所需的具体应用功能 进程由程序段、数据段、进程控制块三部分组成 程序段也被称为是代码段,…...

keepalived学习记录:对其vip漂移过程采用gdb跟踪
对其vip漂移过程采用gdb跟踪keepalived工具主要功能产生vip漂移过程两种情况gdb调试常用命令gdb调试时打到的函数栈(供学习参考)函数栈的图是本人理解下画的,不对请多指正 keepalived主要有三个进程,父进程是core进程,…...

51单片机串口通讯原理及程序源码-----day8
51单片机串口通讯原理及程序源码-----day8 1.定义单片机为TTL电平:高 5V 低 0V RS232电平: 计算机的串口高 -12V 低12V 所以计算机与单片机之间通讯时需要加电平转换芯片CH340T 、 MAX232。 2.通信分类: (1)并行通信通…...
mongodb入门到使用(下)
mongodb中常用命令操作一、用户操作二、创建用户三、数据库操作基本操作四、扩展操作五、集合操作一、用户操作 在mongo中使用mongodb都需要在admin数据库中操作。然后在使用下面的命令 use admin二、创建用户 db.createUser({"user":"imooc", #用户名&q…...

云HIS系统源码 医院his源码 云his源码
大型医院his系统源码 SaaS运维平台多医院入驻强大的电子病历完整文档 ,有演示 一、系统概述: 基层卫生健康云是一款满足基层医疗机构各类业务需要的健康云产品。该产品能帮助基层医疗机构完成日常各类业务,提供病患挂号支持、病患问诊、电子…...
朴素贝叶斯法学习笔记
频率派和贝叶斯派 频率派认为可以通过大量实验,从样本推断总体。比如假定总体服从均值为μ\muμ,方差为σ\sigmaσ的分布。根据中心极限定理,是可以通过抽样估算总体的参数的,而且抽样次数越多,对总体的估计就越准确。…...

vscode与C++安装与使用【不好用来骂我】
网上教程很多,但是都不太好用,这是我垃圾堆里淘金淘出来的教程: 安装软件 安装 Visual Studio Code: 你需要下载并安装 Visual Studio Code,可以在官网下载 https://code.visualstudio.com/download。 安装 C 扩展: 在 Visual S…...
C++11使用多线程(线程池)计算相似度实现性能优化
需求:图像识别中,注册的样本多了会影响计算速度,成为性能瓶颈,其中一个优化方法就是使用多线程。例如,注册了了3000个特征,每个特征4096个float。可以把3000个特征比对放到4个线程中进行计算,然…...

【测绘程序设计】——平面坐标转换
测绘工程中经常遇到平面坐标转换——比如,北京54(或西安80)平面坐标转换成CGCS2000平面坐标、工程独立坐标系平面坐标转换成CGCS2000平面坐标等,常用转换模型包括:①三参数法(2平移+1旋转);②四参数法(赫尔默特法,2平移+1旋转+1尺度);③六参数法(仿射变换法,2平移…...

五子棋的设计与实现
术:Java等摘要:五子棋是一种两人对弈的纯策略型棋类游戏,非常容易上手,老少皆宜。为了更好的推广五子棋,研究简单的人工智能方式,运用Java开发五子棋游戏。主要包含了人机对战,棋盘初始化&#…...
大数据项目软硬件选择
目录 一.技术选型 二.系统数据流程设计 三.框架版本选型 如何选择Apache/CDH/HDP版本...

redis数据结构的适用场景分析
1、String 类型的内存空间消耗问题,以及选择节省内存开销的数据类型的解决方案。 为什么 String 类型内存开销大? 图片 ID 和图片存储对象 ID 都是 10 位数,我们可以用两个 8 字节的 Long 类型表示这两个 ID。因为 8 字节的 Long 类型最大可以…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...