Python | 蓝桥杯进阶第一卷——字符串

news2025/3/10 5:35:22

在这里插入图片描述

欢迎交流学习~~


专栏: 蓝桥杯Python组刷题日寄


蓝桥杯进阶系列:

🏆 Python | 蓝桥杯进阶第一卷——字符串
🔎 Python | 蓝桥杯进阶第二卷——递归(待续)
💝 Python | 蓝桥杯进阶第三卷——动态规划(待续)
✈️ Python | 蓝桥杯进阶第四卷——图论(待续)
🌞 Python | 蓝桥杯进阶第五卷——数论(待续)
🌠 Python | 蓝桥杯进阶第六卷——贪心(待续)
💎 Python | 蓝桥杯进阶第七卷——搜索(待续)


Python | 蓝桥杯进阶第一卷——字符串

  • 🎁 字符串的修改
  • 🌲 ISBN码
  • 🚀 完美的代价
  • 💡 字符串的展开
  • 🍞 正则问题


🎁 字符串的修改

时间限制:
1s

内存限制:
128MB

题目描述:
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

  1. 删除一个字符;
  2. 插入一个字符;
  3. 将一个字符改为另一个字符。

对任给的两个字符串 AB,计算出将字符串 A 变换为字符串 B 所用的最少字符操作次数。

输入描述:
第一行为字符串 A;第二行为字符串 B;字符串 AB 的长度均小于 200

输出描述:
只有一个正整数,为最少字符操作次数。

样例输入:

sfdxbqw
gfdgw

样例输出:
4


解题思路

本题思路如下:

  1. 求解两字符串的最长公共子序列,得到其长度 L
  2. 计算最少字符操作次数

本题思路的核心在于 求解两个字符串的最长公共子序列。
可以选择用循环暴力求解,但是时间复杂度过高,容易超时。因此我们这里可以选用时间复杂度更低的动态规划方法:

  • dp[i][j] 表示 a[:i-1]b[:j-1] 的最长公共子序列的长度 i>0, j>0,对应 dp 数组的大小为 dp[l1+1][l2+1]l1l2 为两个字符串的长度;
  • i=0j=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] + 1
        else:
            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 是这样得到的:对 0670821629 个数字,从左至右,分别乘以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 = 0
        for i in range(len(s)-1):
            id += int(s[i]) * (i + 1)
        id %= 11
        id = 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 == 1
            if n%2 == 0 or flag == 1:
                res = False
                break
            flag = 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 += 1
            L -= 1
            break

    # 如果是impossible,退出外层循环
    if res == False:
        break

if res == False:
    print('Impossible')
else:
    print(count)

💡 字符串的展开

时间限制:
1s

内存限制:
128MB

题目描述:
在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于 d-h 或者 4-8 的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为 defgh45678。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:

  • 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号 -,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
  • 参数p1:展开方式。p1=1 时,对于字母子串,填充小写字母;p1=2 时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3 时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号 * 来填充。
  • 参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充 k 个。例如,当 p2=3 时,子串d-h 应扩展为 deeefffgggh。减号两边的字符不变。
  • 参数p3:是否改为逆序:p3=1 表示维持原来顺序,p3=2 表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1p2=2p3=2时,子串 d-h 应扩展为 dggffeeh
  • 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:d-e 应输出为 de3-4 应输出为 34。如果减号右边的字符按照 ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:d-d 应输出为 d-d3-1 应输出为 3-1

输入描述:
输入包括两行:
1 行为用空格隔开的 3 个正整数,一次表示参数 p1p2p3
2 行为一行字符串,仅由数字、小写字母和减号 - 组成。行首和行末均无空格。

数据规模和约定
100%的数据满足:1<=p1<=31<=p2<=81<=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
        ## p3
        if 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)]
        
        ## p1
        for j in index_j:
            # chr()转为字符
            tmp = chr(j)
            if p1 == 2:
                # 变为大写
                tmp = tmp.upper()
            elif p1 == 3:
                # 变为 '*'
                tmp = '*'
            
            ## p2
            # 重复 p2 次
            res += tmp * p2
    else:
            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, floor
    print(f'此时: i = {i}')
    floor += 1
    print(f'进入一层,此时的层数为 {floor}')
    res = 0
    while i < len(s):
        # 遇到 '(',递归调用函数,对接下的 'x' 计数
        if s[i] == '(':
            i += 1
            res += dfs()
            i += 1
            print(f'此时: i = {i}')
        # 遇到 ')',返回计数结果
        elif s[i] == ')':
            floor -= 1
            print(f'退出一层,此时的层数为 {floor}')
            return res
        # 遇到 'x',计数+1,索引后移
        elif s[i] == 'x':
            i += 1
            print(f'此时: i = {i}')
            res += 1
        # 遇到 '|',返回左右两边的较大值
        elif s[i] == '|':
            i += 1
            res = max(res, dfs())
    return res

dfs()

输出结果:

此时: 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 = 0

def dfs():
    global i
    res = 0
    while i < len(s):
        # 遇到 '(',递归调用函数,对接下的 'x' 计数
        if s[i] == '(':
            i += 1
            res += dfs()
            i += 1
        # 遇到 ')',返回计数结果
        elif s[i] == ')':
            return res
        # 遇到 'x',计数+1,索引后移
        elif s[i] == 'x':
            i += 1
            res += 1
        # 遇到 '|',返回左右两边的较大值
        elif s[i] == '|':
            i += 1
            res = max(res, dfs())
    return res

print(dfs())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读-End-to-End Open-Domain Question Answering with BERTserini

论文链接&#xff1a;https://aclanthology.org/N19-4013.pdf 目录 摘要 1 简介 2 背景及相关工作 3 系统架构 3.1 Anserini Retriever 3.2 BERT 阅读器 4 实验结果 5演示 6结论 摘要 我们展示了一个端到端的问答系统&#xff0c;它将 BERT 与开源 Anserini 信息检索…

MSYS2安装

最近在学习windows上编译FFmpeg&#xff0c;需要用到msys2&#xff0c;在此记录一下安装和配置过程。 点击如下链接&#xff0c;下载安装包&#xff1a; Index of /msys2/distrib/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我下载的是&#xff1a;ms…

相信人还是相信ChatGPT,龙测首席AI专家给出了意料之外的答案

最近&#xff0c;关于ChatGPT的话题太火了&#xff01;各大社交软件都是他的消息&#xff01;从去年12月份ChatGPT横空出世&#xff0c;再到近期百度文心一言、复旦Moss的陆续宣布&#xff0c;点燃了全球对AIGC&#xff08;内容人工智能自动生成&#xff09;领域的热情&#xf…

搭建Bitbucket项目管理工具详细教程

目录 1.安装前准备 2.jdk安装 2.1.rpm安装方式&#xff1a; 3.创建bitbucket数据库 4.安装Git 5.安装bitbucket 5.1下载完成上传至服务器的 /usr/atlassian/ 目录下 5.2安装atlassian-bitbucket-7.21.0 5.3安装MySQL驱动 5.4破解激活bitbucket 1.安装前准备 首先查看操…

Python 之网络式编程

一 客户端/服务器架构 即C/S架构&#xff0c;包括 1、硬件C/S架构&#xff08;打印机&#xff09; 2、软件B/S架构&#xff08;web服务&#xff09; C/S架构与Socket的关系&#xff1a; 我们学习Socket就是为了完成C/S的开发 二 OSI七层 引子&#xff1a;   计算机组成…

【Spark分布式内存计算框架——Spark Streaming】13. 偏移量管理(下)MySQL 存储偏移量

6.3 MySQL 存储偏移量 此处将偏移量数据存储到MySQL表中&#xff0c;数据库及表的DDL和DML语句如下&#xff1a; -- 1. 创建数据库的语句 CREATE DATABASE IF NOT EXISTS db_spark DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci; USE db_spark ; -- 2. 创建表的语句 CRE…

蓝牙资讯|2022 年 Q4 全球 TWS 耳机出货量 7900 万部

Canalys 最新数据显示&#xff0c;2022 年第四季度&#xff0c;全球个人智能音频设备出货量下降 26%&#xff0c;跌至 1.1 亿部。所有品类的出货量都面临不一的下滑趋势&#xff0c;甚至是一直支撑市场的 TWS 品类也遭遇 23% 两位数的下降至 7900 万部。 全球市场方面&#x…

MySQL中varchar(M)存储字符串过长

最近写项目&#xff0c;数据库报了一个错&#xff0c;错误原因是MySQL中存储的字符串过长最近在学MySQL的基础&#xff0c;刚好学到了关于varchar类型要存储的字符串是 “<p>12121212121212</p>\n<p><img src\"https://zzjzzjzzjbucket.oss-cn-hangz…

附录5-大事件项目前端

目录 1 前言 2 用到的插件 2.1 截取图像 cropper 2.2 富文本编辑器 tinymce 3 项目结构 4 config.js 5 主页 5.1 iframe 5.2 页面的宽高 5.3 修改文章 6 个人中心-基本资料 7 个人中心-更换头像 8 个人中心-更换密码 9 文章管理-文章分类 10 文章…

Springboot集成kafka(环境搭建+演示)|超级详细,建议收藏

Springboot集成kafka一、前言&#x1f525;二、环境说明&#x1f525;三、概念&#x1f525;四、CentOS7安装kafka&#x1f525;1.下载kafka安装包2.下载好后&#xff0c;进行解压六、kafka项目集成&#x1f525;1️⃣pom引入2️⃣配置kafka3️⃣一个kafka消息发送端4️⃣定义一…

MySQL45讲笔记04深入浅出索引上

索引的目的: 索引的出现其实就是为了提高数据查询的效率&#xff0c;就像书的目录一样。常见索引模型&#xff1a; hash表&#xff0c;以K-V键值对的形式的一种数据结构&#xff0c;底层是数组加链表形式。通过一定的hash运算找到数据合适的位置放入&#xff0c;如果放入的位置…

[jetson]paddlepaddle2.4.0在jetpack5.0.2源码编译流程

由于官方暂时没有提供jetson对应的jetson jetpack5.0.2预编译包&#xff0c;因此只有源码编译&#xff0c;本次编译不带Tensorrt,编译已经顺利成功&#xff0c;注意本次使用的设备是jetson NX 测试环境&#xff1a; ubuntu20.04 jetpack5.0.2 GCC-8.4 Software part of jet…

Centos7搭建NFS

1.NFS简介Network File System(网络文件系统&#xff0c;通过网络让不同的机器系统之间可以彼此共享文件和目录&#xff0c;类似Samba服务。2.NFS挂载原理 在网络中服务器和客户端进行连接都是通过端口进行数据传输&#xff0c;而NFS服务端的端口是随机的&#xff0c;从而导致N…

Linux----网络基础(2)--应用层的序列化与反序列化--守护进程--0226

文章中有使用封装好的头文件&#xff0c;可以在下面连接处查询。 Linux相关博文中使用的头文件_Gosolo&#xff01;的博客-CSDN博客 1. 应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 1.2 协议 我们在之前的套接字编程中使用的是…

最适合你的团队云协作工具

团队云协作工具哪个好&#xff1f;使用Zoho Projects的团队云协作软件套件&#xff0c;在一个平台上无缝协作&#xff0c;激励您的团队在任何地方以最好的状态完成他们的工作。 使您的团队能够使用团队云协作软件在任何地方进行协作和沟通。Zoho Projects提供了一套强大…

三天吃透计算机网络八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

一文读懂光学天线

天线&#xff0c;按维基百科的定义&#xff0c;"是一种用来发射或接收无线电波—或更广泛来讲—电磁波的器件"。例如&#xff0c;在无线通信系统中&#xff0c;天线被用于发射与接收射频与微波波段的电磁波。而在我们的智能手机中&#xff0c;就有内置的平面倒F天线(…

01-认识产品经理

文章目录引入1.1 合格的产品经理1.2 产品经理的分类按服务对象不同划分按产品平台不同划分按公司所属行业不同按工作内容划分按职级高低划分1.3 产品经理的岗位职责产品的开发流程核心团队成员及其职责产品经理工作中常见误区1.4 产品经理的能力素质专业技能&#xff08;干得了…

Unity Lighting -- 配置平行光源和天空盒

识别不同种类的光源 在游戏或实时应用程序中&#xff0c;我们可能会创建多种不同种类的场景&#xff0c;比如室内场景、室外场景、真实的场景或完全想象的场景。即便项目是一个完全的想象的或是科幻的故事&#xff0c;灯光也是非常重要的一环&#xff0c;它能极大提升沉浸感。 …

Python3-条件控制

Python3 条件控制 Python 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 代码执行过程&#xff1a; if 语句 Python中if语句的一般形式如下所示&#xff1a; if condi…