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

wdcp网站备份制作简单的网页

wdcp网站备份,制作简单的网页,android开发app,高端建站和普通建站有哪些不同最小化二进制字符串中最长相同子字符串的长度 在处理二进制字符串问题时#xff0c;优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题#xff1a;给定一个长度为 n 的二进制字符串 s 和一个整数 numOps#xff0c;通过最多 numOps 次位翻转操作优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题给定一个长度为 n 的二进制字符串 s 和一个整数 numOps通过最多 numOps 次位翻转操作最小化字符串 s 中最长相同子字符串的长度。 问题描述 输入 字符串 s长度为 n 的二进制字符串仅由字符 0 和 1 组成。整数 numOps允许执行的最大位翻转次数。 操作 在每次操作中你可以选择任意一个下标 i0 i n并翻转 s[i] 的值 如果 s[i] 1则将其改为 0。如果 s[i] 0则将其改为 1。 目标 通过最多 numOps 次操作最小化字符串 s 中最长相同子字符串的长度。相同子字符串指的是子字符串中的所有字符都相同。 示例 示例 1 输入: s 000001, numOps 1输出: 2解释: 将 s[2] 改为 1得到 s 001001。此时最长的相同子字符串为 s[0..1] 和 s[3..4]长度均为 2。 示例 2 输入: s 0000, numOps 2输出: 1解释: 将 s[0] 和 s[2] 改为 1得到 s 1010。所有相同子字符串的长度均为 1。 示例 3 输入: s 0101, numOps 0输出: 1解释: 不进行任何操作字符串中所有相同子字符串的长度均为 1。 本题重要概念 段的分割 在优化字符串以最小化最长相同子字符串长度的过程中段的分割是关键步骤。这里的“分割”不仅仅是简单地将字符串切开而是通过翻转特定位置的字符将一个连续的相同字符段划分为多个较小的段从而减少最长段的长度。 具体来说假设有一个长度为 k 的连续相同字符段。通过翻转其中的若干字符可以将这个段分割成 seg 1 个子段。每次翻转一个字符相当于在该位置引入一个不同字符从而将原来的段划分为两个部分。例如 示例考虑一个包含 10 个连续 ‘0’ 的字符串 “0000000000”。 如果我们翻转其中的 2 个 ‘0’ 为 ‘1’例如将索引 3 和 7 位置的 ‘0’ 翻转为 ‘1’字符串变为 “0001000100”。 这样原本的 10 个 ‘0’ 被分割成了三个子段“000”, “000”, 和 “00”。 经过这次分割最长的 ‘0’ 子段长度由 10 减少到了 3。 通过这种方式每次翻转操作都能有效地将一个较长的段分割成多个较短的段从而逐步减少整个字符串中最长相同子字符串的长度。具体来说一个长度为 k 的段经过 seg 次分割后每个子段的最大长度大约为 ceil(k / (seg 1))。 解题思路 要最小化字符串中最长相同子字符串的长度可以通过以下步骤进行优化 检查是否可以分割为长度为1的子串 首先判断是否可以通过最多 numOps 次翻转操作将字符串 s 转换为一个交替字符串如 1010 或 0101。如果可以实现则返回 1因为此时最长的相同子字符串长度为 1。 处理长度为2的字符串 对于长度为2的字符串如果无法转换为交替字符串即已经是 00 或 11则不需要进一步分割。因为分割长度为2的字符串会影响前后部分且前面已经判断了是否可以得到长度为1的结果。如果当前最长的子串长度已经是2则答案必定是2。 分段统计 将字符串 s 分割成连续的相同字符段。例如000001 可以分为 [00000, 1]。 优先处理最长段 通过优先将最长的相同字符段进行分割可以有效减少最长段的长度。具体而言使用优先队列堆来不断选择当前最长的段进行分割。 段的分割 每次分割一个段将其分成更多的小段从而降低该段的最大长度。假设一个段的长度为 k通过翻转特定位置的字符将这个段分割seg次成 seg 1 个子段每段的最大长度约为 ceil(k / (seg 1))。 迭代操作 重复上述过程直到用完所有的操作次数 numOps 或者无法进一步优化。 最终结果 操作完成后堆顶元素即为当前最长相同子字符串的长度。 代码实现 from heapq import heapify, heapreplace from itertools import groupbyclass Solution:def minLength(self, s: str, numOps: int) - int:n len(s)# 首先检查是否可以通过 numOps 次翻转将字符串转为交替字符串# 交替字符串有两种可能0101... 或 1010...# 计算将 s 转换为这两种模式所需的翻转次数ops_to_alternate_0 sum(1 for i, c in enumerate(s) if c ! (0 if i % 2 0 else 1))ops_to_alternate_1 sum(1 for i, c in enumerate(s) if c ! (1 if i % 2 0 else 0))min_ops_to_alternate min(ops_to_alternate_0, ops_to_alternate_1)# 如果可以通过翻转操作将字符串转为交替字符串则最长相同子字符串长度为1if min_ops_to_alternate numOps:return 1# 特殊处理长度为2的字符串if n 2:# 如果已经是交替字符串返回1if s[0] ! s[1]:return 1# 否则需要至少1次操作将其分割为交替elif numOps 1:return 1else:return 2 # 无法分割最长相同子字符串长度为2# 分组统计连续相同字符的段groups [len(list(group)) for _, group in groupby(s)]# 如果分组中所有段的长度均为1则已经是交替字符串if all(g 1 for g in groups):return 1# 初始化堆存储每个段的最大长度及分割次数# 堆中存储 (-最大长度, 原始长度, 分割次数)heap [(-g, g, 1) for g in groups]heapify(heap)for _ in range(numOps):max_seg, k, seg heap[0]# 如果当前最长段已经不能进一步分割if max_seg -2:return 2# 将当前最长段进行一次分割# 新的最大长度为 ceil(k / (seg 1))这里用整除代替ceil# 因为 k // (seg 1) 已经是向下取整取负数用于最大堆new_max -(k // (seg 1))# 更新分割次数new_seg seg 1# 替换堆顶元素heapreplace(heap, (new_max, k, new_seg))# 返回操作后的最长相同子字符串长度return -heap[0][0]
http://www.hkea.cn/news/14532340/

相关文章:

  • 做推广的的网站模板工程网站模板
  • 开个做网站要多少钱怎么建立自己的小程序
  • 服装网站网络建设和硬件资源郑州大型网站建设电话
  • 嘉定华亭网站建设中国个人优秀网站
  • seo站内优化公司网址怎么注册步骤
  • 百度网站地图代码卫浴毛巾架网站建设
  • 中国住房建设网官方网站廊坊做网站公司哪家好
  • 企业网站租服务器东盟经济技术开发区建设网站
  • 本地网站搭建视频教程南宁seo公司
  • 网站关键词优化的步骤和过程网站架构设计师待遇怎么样
  • ps中怎样做网站轮播图片新东方考研培训机构官网
  • 网站开发小公司推荐龙岗企业网站设计公司
  • 大庆开发网站公司第一家中文商务网站
  • 手机企业网站多少钱成都工程建设信息网站
  • 想建设个网站怎么赚钱找个网站懂的网站
  • php网站上线利用angular做的网站
  • 成都定制企业网站制作做地方网站数据哪里来
  • seo网站推广优化费用学习网站大全
  • 临城网站建设网站建设 技术要求
  • django 开发一个公司网站百度关键词查询工具免费
  • 网站建设的好处论文郑州做网站怎么样
  • 枣庄机关建设网站网站设计命名规范
  • 深圳视频网站开发wordpress中英文网站模板
  • phpcms 网站名称标签工作是否能给我们带来快乐
  • 做网站都是怎么收费江苏九天建设有限公司网站
  • 我的世界寻找建筑网站全网线报 实时更新
  • 最好的手机网站建设江苏网站seo营销模板
  • 企业门户网站管理办法秦皇岛海三建设
  • 烟台企业网站制作公司东莞网站建设多少钱
  • 贵州网站开发北京网站优化推广公司