当前位置: 首页 > news >正文

百度网站两两学一做心得体会网页设计有什么要求

百度网站两两学一做心得体会,网页设计有什么要求,网站怎么做图片放映效果,企业网络营销项目AcWing《蓝桥杯集训每日一题》—— 1460. 我在哪? 文章目录AcWing《蓝桥杯集训每日一题》—— 1460. 我在哪?一、题目二、解题思路三、代码实现本次博客我是通过Notion软件写的,转md文件可能不太美观,大家可以去我的博客中查看&am…

AcWing《蓝桥杯集训·每日一题》—— 1460. 我在哪?

文章目录

  • AcWing《蓝桥杯集训·每日一题》—— 1460. 我在哪?
  • 一、题目
  • 二、解题思路
  • 三、代码实现

本次博客我是通过Notion软件写的,转md文件可能不太美观,大家可以去我的博客中查看:北天的 BLOG,持续更新中,另外这是我创建的编程学习小组频道,想一起学习的朋友可以一起!!!

一、题目

沿路有一排共 NNN 个农场。

不幸的是农场并没有编号,这使得约翰难以分辨他在这条路上所处的位置。

然而,每个农场都沿路设有一个彩色的邮箱,所以约翰希望能够通过查看最近的几个邮箱的颜色来唯一确定他所在的位置。

每个邮箱的颜色用 A..ZA..ZA..Z 之间的一个字母来指定,所以沿着道路的 NNN 个邮箱的序列可以用一个长为 NNN 的由字母 A..ZA..ZA..Z 组成的字符串来表示。

某些邮箱可能会有相同的颜色。

约翰想要知道最小的 A..ZA..ZA..Z 的值,使得他查看任意连续 KKK 个邮箱序列,他都可以唯一确定这一序列在道路上的位置。

例如,假设沿路的邮箱序列为 ABCDABC 。

约翰不能令 K=3K = 3K=3,因为如果他看到了 ABC,则沿路有两个这一连续颜色序列可能所在的位置。

最小可行的 K 的值为 K=4K = 4K=4,因为如果他查看任意连续 4 个邮箱,那么可得到的连续颜色序列可以唯一确定他在道路上的位置。

输入格式

输入的第一行包含 NNN,第二行包含一个由 NNN 个字符组成的字符串,每个字符均在 A..ZA..ZA..Z 之内。

输出格式

输出一行,包含一个整数,为可以解决农夫约翰的问题的最小 KKK 值。

数据范围

1≤N≤1001≤ N ≤1001N100

输入样例:

7
ABCDABC

输出样例:

4

二、解题思路

1、暴力枚举法

对于暴力枚举法,我们可以使用两重循环,外层循环枚举K的长度,内层循环枚举所有的子串,并在后面的部分中查找该子串是否出现过。如果没有找到,则表示当前长度K可行,输出K并结束程序。如果内层循环结束后仍未找到合适的K,则需要继续外层循环进行下一轮枚举。

2、二分法

对于二分法,我们可以将判断一个长度K是否可行转化为判断以每个位置为起点的长度为K的子串是否互不相同。具体地,我们可以将所有以长度K的子串存入一个集合中,然后判断集合中的元素个数是否等于N-K+1。如果等于,则表示当前长度K可行,否则不可行。因为如果有重复的子串,那么集合中的元素个数会小于N-K+1,如果没有重复的子串,则集合中的元素个数会等于N-K+1。根据这个判断结果来缩小二分法的搜索范围,直到找到最小可行的K。

三、代码实现

n = int(input())         # 输入农场数
s = input().strip()      # 输入邮筒序列res = n                  # 初始化最小连续颜色长度res为nfor k in range(1, n+1):  # 外层循环枚举连续颜色长度k,从1到nseen = set()         # 定义一个集合seen,用于存储当前长度为k的所有子串unique = True        # 初始化unique为True# 内层循环枚举字符串s中长度为k的所有子串for i in range(n-k+1):sub = s[i:i+k]   # 取出从i开始长度为k的子串subif sub in seen:   # 如果sub已经在seen中出现过了,说明有重复子串,此时unique为Falseunique = Falsebreakelse:seen.add(sub) # 否则将sub加入seen集合中if unique:            # 如果unique为True,说明当前枚举的k值可以唯一确定任意连续k个邮箱序列在道路上的位置res = k           # 更新最小连续颜色长度resbreakprint(res)                # 输出最小的k值,即可以解决农夫约翰的问题的最小K值

该段代码的时间复杂度为 O(n2)O(n^2)O(n2),因为外层循环枚举了 kkk 个长度,内层循环每次需要枚举 n−k+1n-k+1nk+1 个长度为 kkk 的子串,并且使用了 set 进行查重。set 的查找时间复杂度为 O(1)O(1)O(1),所以内层循环的时间复杂度为 O((n−k+1)×1)=O(n−k+1)O((n-k+1) \times 1) = O(n-k+1)O((nk+1)×1)=O(nk+1)。因此,总的时间复杂度为:∑k=1n(n−k+1)=O(n2)\sum_{k=1}^{n} (n-k+1) = O(n^2)k=1n(nk+1)=O(n2)

其中,∑k=1n(n−k+1)\sum_{k=1}^{n} (n-k+1)k=1n(nk+1) 是等差数列求和公式的展开形式。

二分解法:

n = int(input())         # 输入农场数
s = input().strip()      # 输入邮筒序列def check(k):            # 定义check函数用来检查k的取值是否满足条件substrings = set()   # 用set存储s中所有长度为k的不同的子串for i in range(n-k+1):substrings.add(s[i:i+k])return len(substrings) == n-k+1  # 如果set中的元素个数为n-k+1则说明所有长度为k的子串均不相同left, right = 1, n              # 初始时,left=1,right=n
while left < right:             # 当left < right时,循环继续mid = (left+right)//2       # 计算中间值midif check(mid):       # 如果check(mid)返回True,则说明k=mid满足条件,应该继续往左找right = midelse:                # 如果check(mid)返回False,则说明k=mid不满足条件,应该往右找left = mid+1print(left)                 # 最终left就是满足条件的最小的k

该二分法代码的时间复杂度为O(nlogn)O(nlogn)O(nlogn)*,*其中nnn为字符串的长度。主要耗时的是check函数,时间复杂度为O(nk)O(nk)O(nk)kkk是检查的子串长度,当k=nk=nk=n时,时间复杂度最大为O(n2)O(n^2)O(n2)。而二分法中循环的次数最多为O(logn)O(logn)O(logn),因此总时间复杂度为O(n∗logn)O(n*logn)O(nlogn)

http://www.yayakq.cn/news/619325/

相关文章:

  • 深圳建设网站过程便宜的seo网站优化排名
  • 富阳区建设工程质监站网站网站开发需求文档prd模板
  • app介绍网站模板怎样注册免费域名
  • 手机高端网站开发全国高速公路施工建设有没有网站
  • 做网站必须用域名吗织梦网站地图怎么做
  • 网站域名后缀那个好河南郑州网站建设
  • 微信端微网站怎么做分销系统大概多少钱
  • 正规设计兼职网站有哪些5千ip的网站能赚多少钱
  • 苏州企业网站优化网页优化方法
  • 阳泉网站建设哪家便宜新八建设集团网站
  • 食品网站建设策划书建设局网站查询
  • 如何制作一个自己的网页网站做任务的电脑网站
  • 免费域名x网站微信电商小程序
  • 包装设计网上设计平台西安seo管理
  • 如何添加网站关键词学做网站php
  • 做网站颜色如何搭配app软件下载站seo教程
  • 湟中县公司网站建设离石市网站建设公司
  • 做肯德基玻璃门网站最新大连市热议新闻
  • 官方网站建设银行网上做效果图
  • 商业网站建设费用c asp.net 做网站
  • 农业建设公司网站互联网营销是做什么
  • 眼科医院网站设计怎么做电脑店免费建站
  • 甘肃住房和城乡建设部网站企业为什么要年检
  • windows 网站建设北京亦庄做网站公司
  • 网站开发补充协议暴雪被收购
  • 建设网站最好的软件店铺推广软文案例
  • 2018做分享网站巨野做网站
  • 中企潍坊分公司网站网站开发用什么工具
  • 盐城网站开发建设国外文件传输网站
  • 市场推广策略 包括哪些wordpress 中文 seo 插件