最小最大表示法超详细讲解

news2024/11/16 22:01:39

文章目录

    • 前言
    • 循环同构串
    • 最小表示法
      • 暴力解法
      • 暴力解法的可优化之处
      • 最小表示法的代码实现
    • 最大表示法

前言

最小/最大表示法是用来找出字符串的最小/最大字典序的循环同构串的方法,其求解算法可以达到O(N),过程很像KMP算法的next数组推导过程,都是在暴力解法的基础上省去了冗余操作。

循环同构串

学习最小/最大表示法,先要了解循环同构串的概念。

给定长度为n字符串S,将其当作环形字符串,则给定i(0 <= i <= n- 1),s[ i ] , s[(i + 1) % n] … s[(i + n - 1) % n]所构成的新字符串就是S的一个循环同构串
设S= “bcad”,其循环同构串有"bcad"、“cadb” 、“adbc” 、“dbca”,
当i = 2时,得到字典序最小的循环同构串是“adbc"。
最小/最大表示法就是找出字符串S的循环同构串中字典序最小/最大的那一个。

最小表示法

对于循环串(或环),我们可以选择直接将其倍增一次,但是倍增的空间其实可以通过下标取模来优化掉。

(倍增后)s[i + k] = (倍增前)s[(i + k) % n]

暴力解法

暴力解法流程:

  • 两个指针i,j分别代表两个循环同构串的起始位置
  • 当i串的字典序大于j串,i = max(i + 1, j + 1)
  • j串字典序小于i串j = max(i + 1, j + 1)
  • 当i == j时,j++
  • 最终取二者中小的那个就是答案

代码如下:

    //string s;
    int i = 0, j = 1, k, n = s.size();
    while (i < n && j < n)
    {
        for (k = 0; k < n && s[(i + k) % n] == s[(j + k) % n]; k++)
            ;
        if (s[(i + k) % n] > s[(j + k) % n])
            i = max(i + 1, j + 1);
        else
            j = max(i + 1, j + 1);
        if (i == j)
            j++;
    }

要进行n - 1次比较,时间复杂度为O(N^2)

暴力解法的可优化之处

还是类比KMP算法,我们KMP算法就是对略去了暴力字符串匹配中的冗余操作而达到了O(M + N)的时间复杂度,那么我们的暴力寻找最小循环同构串的过程有没有冗余之处呢?

我们发现每次j都是从j的下一个位置重新进行匹配,有没有一种可能我们之前匹配过的字符可以跳过或者说跳过部分呢?

我们以S = "acacaba"为例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图情况中按照暴力解法,i应该跳转到j + 1,也就是c的位置,跳转后的字典序显然仍小于j串,于是还要继续跳转到a的位置,我们发现此时i跳到了第一次比较失败的下一个位置

我们不禁想当比较失败时,指针是否可以直接跳转到比较失败的下一个位置呢?

我们假设i < j,此时i串字典序小于j串,在i + k 和 j + k的地方匹配失败

那么在i和j之间的部分,j能达到j的位置说明i和j之间的部分字典序显然大于i串,所以不必跳转到此区间

而 j 到i+k之间的部分,我们发现j 到 i + k是i串和j串的最长公共前缀,如果有字符小于s[ i ],那么由于前缀的对应关系我们最终会得到s[ i ] < s[ i ]的结论,显然不对,所以我们的优化策略就是i直接跳转到i + k + 1的位置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优化后,每次扫描k个长度,相应的i和j会往后移动k,i,j合计一共最多往后移动2n的长度,所以时间复杂度是O(n)

最小表示法的代码实现

算法流程:

  1. 初始化指针i=0,j=1,匹配长度k=0;
  2. 比较s[(i+ k)%n]和s[(j+k)%n]是否相等,
  3. (1)s[(i+ k)%n]==s[(j+k)%n],则k++;
  4. (2)s[(i+ k)%n] > s[(j+k)%n],则i=i+k+1;
  5. (3)s[(i+ k)%n] < s[(j+k)%n],则j=j+k+1;
  6. 若跳转后两个指针相同,则j++,以确保比较的两个字符串不同;
  7. 重复上述过程,直到比较结束;
  8. 答案为min(i, j)。
    int i = 0, j = 1, k, n = s.size();
    while (i < n && j < n)
    {
        for (k = 0; k < n && s[(i + k) % n] == s[(j + k) % n]; k++)
            ;
        if (s[(i + k) % n] > s[(j + k) % n])
            i = i + k + 1;
        else
            j = j + k + 1;
        if (i == j)
            i++;
    }
    i = min(i, j);

最大表示法

最大表示法和最小表示法的原理一样,只要修改代码中的条件即可

代码如下

    int i = 0, j = 1, k, n = s.size();
    while (i < n && j < n)
    {
        for (k = 0; k < n && s[(i + k) % n] == s[(j + k) % n]; k++)
            ;
        if (s[(i + k) % n] < s[(j + k) % n])
            i = i + k + 1;
        else
            j = j + k + 1;
        if (i == j)
            i++;
    }
    i = min(i, j);

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

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

相关文章

k8s-pod管理 3

pod是可以创建和管理k8s 计算的最小可部署单元&#xff0c;一个pod 代表着集群中运行的一个进程&#xff0c;每个pod 都有一个唯一的ip pod包裹了容器 下载测试镜像 创建自主式的pod 查看创建的pod的详情信息 删除pod 创建控制器 副本过多&#xff0c;需要进行负载均衡减轻节点…

uniapp中实现圆形进度条的方式有哪些?

前言 在uniapp开发小程序或者apk时&#xff0c;页面需要用到一个圆形进度条&#xff08;带文字和百分比的&#xff09;&#xff0c;自己也自定义过一个,但是有一点小问题&#xff0c;咱先展示如何引入插件市场的在介绍自定义的&#xff01;一共四种&#xff0c;但是你需要考虑自…

G管螺纹尺寸对照表

G管螺纹尺寸对照表 NPT 是 National (American) Pipe Thread 的缩写&#xff0c;属于美国标准的 60 度锥管螺纹&#xff0c;用于北美地区&#xff0e;国家标准可查阅 GB/T12716-1991 PT 是 Pipe Thread 的缩写&#xff0c;是 55 度密封圆锥管螺纹&#xff0c;属惠氏螺纹家族&a…

视频剪辑技巧:如何高效地将多个视频合并成一个新视频

在视频制作过程中&#xff0c;将多个视频合并成一个新视频是一个常见的操作。这涉及到将多个片段组合在一起&#xff0c;或者将不同的视频素材进行混剪。无论是制作一部完整的影片&#xff0c;还是为社交媒体提供短视频&#xff0c;都要掌握如何高效地将多个视频合并。现在一起…

广州华锐互动:3D模拟体验火箭发射过程有什么教育意义?

3D虚拟还原火箭发射过程在教育领域有着深远的意义。它能够为学生提供直观、生动的体验&#xff0c;帮助他们更好地理解和掌握相关知识&#xff0c;激发他们对科技的兴趣和探索欲望。 首先&#xff0c;3D虚拟还原火箭发射过程可以帮助学生更好地理解和掌握航天科技知识。在火箭发…

vue-waterfall2 实现瀑布流,及总结的问题

注意&#xff1a;引入需要在主界面引入&#xff0c;直接在组件中引用会有问题 1.安装 npm install vue-waterfall21.8.20 --save &#xff08;提示&#xff1a;一定要安装1.8.20&#xff0c;最新版会有一部分问题&#xff09; 2.打开main.js文件 import waterfall from v…

python 实现等声值线图绘制

今天讲一类环评项目的噪声预测 - 风电 风机噪声作为面源目前难有成熟的模型进行预测。根据国内外的研究&#xff0c;都是根据与风机中心的位置进行分级预测。 翟国庆等利用美国航天航空局&#xff08;NASA&#xff09;研发的风电机组噪声预测模型&#xff08;以下简称 NASA”…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大重点分析

数字化时代银行网点厅堂营销存在以下5大重点&#xff1a; 1、厅堂宣传。应以主推产品作为厅堂宣传的宣传重点&#xff0c;结合视频宣传、平面物料、互动机具、陈列物料等多维度&#xff0c;开展有序重复展示&#xff0c;进而加大吸引客户关注度。 2、产品推荐。在识别出中高端…

基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码

基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于混沌博弈优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

亚马逊美国站买家号注册流程

注册亚马逊美国站买家号一般用邮箱及手机号注册就可以了&#xff0c;具体操作如下&#xff1a; 1、在浏览器里面输入亚马逊美国站的官网地址。 2、点击注册&#xff0c;输入姓名、邮箱或手机号、密码&#xff0c;然后进行验证邮箱或者手机号。如果是用的邮箱进行注册验证&…

MyBatis Generator 插件 详解自动生成代码

MyBatis Generator&#xff08;MBG&#xff09;是MyBatis和iBATIS的代码生成器。可以生成简单CRUD操作的XML配置文件、Mapper文件(DAO接口)、实体类。实际开发中能够有效减少程序员的工作量&#xff0c;甚至不用程序员手动写sql。 它将为所有版本的MyBatis以及版本2.2.0之后的i…

2024年测试工程师必看比列之Unittest单元测试框架-知识点总结

unittest单元测试框架 1.导入unittest包 2.创建类的时候要继承与unittest.TestCase类 2.1&#xff0c;setUp方法是在类中测试执行前的初始化工作 2.2&#xff0c;tearDown方法是在类中测试执行后的清除工作 2.3&#xff0c;测试用例函数以test开头的方法是普通的测试用例方法&…

嵌入式Linux学习(1)——经典CAN介绍(上)

目录 一. CAN与ISO-OSI Model 二. CAN通信 2.1 接线方式 2.1.1 闭环网络 2.1.2 开环网络 2.2 收发流程 2.2.1 发送 2.2.2 接收 三. CAN BUS访问与仲裁 3.1 “线与”机制​ 3.2 仲裁机制 REF CAN&#xff08;Controller Area Network&#xff09;总线协议是由 BOSC…

uniapp中swiper 轮播带左右箭头,点击切换轮播效果demo(整理)

可以点击箭头左右切换-进行轮播 <template><view class"swiper-container"><swiper class"swiper" :current"currentIndex" :autoplay"true" interval"9000" circular indicator-dotschange"handleSw…

CVE-2023-0179提权利用

前言 在CVE-2023-0179-Nftables整型溢出中&#xff0c;分析了漏洞的成因&#xff0c;接下来分析漏洞的利用。 漏洞利用 根据漏洞成因可以知道&#xff0c;payload_eval_copy_vlan函数存在整型溢出&#xff0c;导致我们将vlan头部结构拷贝到寄存器&#xff08;NFT_REG32_00-N…

ASO优化之关于iOS的A/B测试

ASO优化的一个重要方面在于运行A/B测试&#xff0c;主要围绕应用图标、屏幕截图和预览视频&#xff0c;从而来完善应用程序的视觉元素和元数据。 1、A/B测试的时间安排。 启动测试之前&#xff0c;需要经过Apple的审核流程。如果我们的预览资源被拒绝&#xff0c;需要调整并重…

java中,通过替换word模板中的关键字后输出一个新文档

一、要用到的jar包 我已上传了相关的jar包&#xff0c;需要的可以通过以下链接直接下载&#xff1a; https://download.csdn.net/download/qq_27387133/88558034 具体jar包截图&#xff1a; 二、实现的代码 注意&#xff1a;文件要用docx格式!!! word变量替换的方法&#…

Altium Designer学习笔记3

原理图生成PCB&#xff1a; 然后是手动布局&#xff1a; 可以看到先没有交叉。 最终再走线。 另外&#xff0c;了解下这个封装的一些概念。

MAVEN——PACKAGE、INSTALL、DEPLOY的联系与区别

我们在用maven构建java项目时&#xff0c;最常用的打包命令有mvn package、mvn install、deploy&#xff0c;这三个命令都可完成打jar包或war&#xff08;当然也可以是其它形式的包&#xff09;的功能&#xff0c;但这三个命令还是有区别的。下面通过分别执行这三个命令的输出结…

抖音短视频如何变成gif图?分享这一招就够了

现在抖音已经是每个人手机必备的消遣时间的软件了&#xff0c;各种各样的视频搞笑有趣。当我们想要将这些搞笑的视频画面提取出来做成gif图片的时候应该怎么办呢&#xff1f;很简单&#xff0c;使用在线制作GIF&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&…