最小表示法 字符串循环同构问题

循环同构串 string 如果将字符串S=s[1],s[2]…s[n]的所有字符左移一位,然后让第一位字符移动到最后一位,即构成新的字符串:S'=s[2],s[3]…s[n],s[1]。这个操作称为字符串的左移。比如字符串orz左移一次得到字符串rzo。若S串能够通过若干次左移之后变成T串,我们就称S和T循环同构,现在给你一个长度为n的字符串S,询问字符串S是否满足以下条件:存在一个整数k>1,满足k是n的因数。将S分成k段子串,每段等长,长度为n/k。存在一个字符串T,与上述的k段子串都循环同构。如果存在k,T满足上述三个条件,那 阅读详情

  用最小表示法返回最小表示串(字典序最小的同构串)第一个字符在原始串中的下标。

  用两个指针i,j,i初始化为0,j初始化为1,用k表示当前已经匹配串的长度。如果str[i+k]==str[j+k],j++,否则如果str[i+k]>str[j+k],说明以i开始的同构串肯定不是最小的,并且以i开始的到以i+k开始的都不会是最小的,因为若以i+x开头,0<=x<=k,那么这时以j+x开头的串比这个串小,因为前面相等,比较到i+k和j+k发现str[j+k]小,因此就把i移到i+k+1。同理如果str[i+k]>str[j+k],把j移到j+k+1,如果i==j,j++。直到i,j,k中有一个大于等于串的长度为止。最后返回i和j里较小的那个。

int min_express(char* str){
    int len=strlen(str),i=0,j=1,k=0;
    while(i<len&&j<len&&k<len){
        int t=str[(j+k)%len]-str[(i+k)%len];
        if(!t) k++;
        else{
            if(t<0) i=i+k+1;
            else j=j+k+1;
            if(j==i) j++;
            k=0;
        }
    }
    return min(i,j);
}


力扣周赛必备:最小表示法原理与实战,高效解决字符串循环同构问题 字符串处理是算法竞赛和面试中的核心考点,其中循环同构问题要求判断两个字符串是否可以通过旋转相互得到。这类问题的经典解法涉及字典序比较和高效的模式匹配。最小表示法作为一种O(n)时间复杂度的双指针算法,专门用于寻找循环字符串的字典序最小表示形式。其原理是通过维护两个候选起点和匹配长度,在扩展字符串上进行比较,并利用不等关系一次性跳过无效起点,从而将时间复杂度从暴力枚举的O(n²)优化至线性。该算法在力扣周赛等竞赛场景中价值显著,能快速解决字符串循环同构判断、最小循环表示求解等高频问题。掌握最小表示法不仅能提升 阅读详情

相关推荐

最小表示法:线性时间解决字符串循环同构与字典序最小化问题

在字符串算法领域,处理循环同构串的字典序比较是一个经典问题。其核心原理在于,通过双指针的竞速淘汰机制,巧妙地利用已匹配信息跳过大量无效比较,从而将时间复杂度从暴力法的 O(n²) 优化至 O(n)。这项技术的工程价值在于,它为力扣周赛等算法竞赛场景提供了高效、稳定的解决方案,尤其适用于需要快速判断字符串循环同构或寻找最小表示的题目。从应用场景来看,该算法不仅是解决特定竞赛题目的利器,其背后‘利用已知信息避免重复计算’的思想,也与 KMP 等高效字符串匹配算法一脉相承。本文聚焦的**最小表示法**,正是这一思

weixin_30878501的博客 360

【字符串循环同构的最小表示法】

循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。 对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最

leolin_的专栏 1380

【Tessent Shell Users Manual】【Ch3】Design Introspection and Editing(未完待续)

Tessent Shell 提供了一系列用于检查(examining/introspecting)和编辑design的命令。

Tranquil_ovo的博客 1731

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

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

EQUINOX1的博客 743

在没有实验数据的情况下,如何高效快速发表高影响因子论文

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

glldxh的博客 371

Metal 一、初识 Metal 及其语言规范

游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。

irainsa的博客 1219

beyond

题目大意给定两个长度为N字符串A与B,求出最大的L,使得A与B的前L个字符所组成的字符串循环同构。N<=2000000。推一推我们知道循环同构的一个特征:可以找到分界点分成两个字符串,然后交叉相同。例如aab与aba,我们可以把第一个字符串分割成a与ab,把第二个字符串分割成ab与a,那么他们交叉相同。 因此我们可以枚举A中分界点i,那么假设能找到B中分界点j,需要满足以下条件: 1、A的后缀i

不来也不去的一只失忆蝴蝶 607

图自编码器(GAE)与变分图自编码器(VGAE)

在学习图自编码器之前先了解一下自编码器与变分自编码器。

小鱼的小窝 1万+

【董晓算法】竞赛常用知识之字符串1

竞赛常用知识之字符串1

2301_80255237的博客 1693

华为OD机试真题 C 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

【工程师一次性讲明白系列】什么是电压驻波比 (VSWR)

电压驻波比(VSWR)是电信号传输过程中非常重要的指标,控制VSWR的大小可以提高信号传输效率和系统稳定性。通过优化阻抗匹配,可以有效地减少反射信号,提升通信质量!🚀📡。

weixin_43199439的博客 1300

字符串循环同构问题与最小表示法

mark一个b站视频,视频地址:https://www.bilibili.com/video/BV1nE411n7wL?share_source=copy_web 附上手写c++代码,丢入vs可直接运行 (头文件比较乱,因为是之前用过的,懒得删了) #include<iostream> #include<math.h> #include<unordered_set> #include<memory> #include<head.h> #includ

qq_36222817的博客 177

华为OD机考双机位C卷 - 手机App防沉迷系统(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 手机App防沉迷系统(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 2061

[转]浅析“最小表示法”思想在字符串循环同构问题中的应用-HDU2609

ACM偶尔会出现最小表示法的题目,下面是一些文档可以帮助理解。 Click me~

优快云 1935

03 Token、Embedding、上下文窗口:开发者必须懂的三个基本概念

Token、Embedding 和上下文窗口是大模型应用开发的三个基础概念。本文从成本、速度、检索和上下文设计四个角度讲清它们的工程意义,帮助开发者理解为什么同一段内容会超限、变贵,为什么 RAG 能做语义检索。

老于的笔记的专栏 408

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

字符串循环同构的最小表示法(转)

循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。 由于语言能力有限,还是用实际例子来解释比较容易:设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最小。一种...

weixin_30408309的博客 84

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最小表示法

定义 给定一个字符串SSS,若不断把它最后一个字符放到开头,则会得到nnn个字符串 我们称这nnn个字符串是循环同构的,其中字典序最小的一个就是SSS的最小表示法 例如S=S=S=&quot;abcaabcaabca&quot;,那么SSS的最小表示法就是&quot;aabcaabcaabc&quot; 求解 比较字符串的字典序大小的最暴力做法是什么?——逐位扫描比较 通常一个神奇的算法就是这么从一个暴力优化得来的 首先为了解决环在处理...

niiick 194

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

hdu 2609 How many (最小表示法)

题目: Problem Description Give you n ( n &lt; 10000) necklaces ,the length of necklace will not large than 100,tell me How many kinds of necklaces total have.(if two necklaces can equal by rotating ,w...

weixin_41568105的博客 175

POJ 1509 Glass Beads

这道题是求字符串最小表示的第一个字符在字符串中的位置。做之前看了IOI2003冬令营周源大神的 论文《浅析“最小表示法”思想在字符串循环同构问题中的应用》。这里虽然每个样例只有一个字符 串,但是我们可以构造出一个字符串s+1,和s来找同构,然后取找到的位置i,j之中小的那个。 /*Accepted 100K 16MS C++ 700B 2012...

weixin_30254435的博客 81

KMP与最小表示法

最近在准备面试,偶尔会遇见y

oahsgnat的专栏 954

字符串处理 —— 最大最小表示法

【概述】 最大最小表示法用于解决字符串的同构问题,其在复杂度为 O(n) 的时间内求出一个字符串的所有同构串中字典序最大(小)的串的起始位置。 应用: 给出 n 个循环字符串判断有多少不同字符串:逐个用最大(小)表示法表示,然后加入 set 去重 循环字符串所有同构串中字典序最大(小)的表示:用最大(小)表示法求出起始位置,输出即可 判断两个字符串是否同构:将两字符串用最大(小)表示法表...

Alex_McAvoy的博客 1073

『最小表示法 Necklace』

最小表示法 这是一个简单的字符串算法,其解决的问题如下: 给定一个字符串\(S\),长度为\(n\),如果把它的最后一个字符不断放到最前面,会得到\(n\)个不同的字符串,那么我们称这\(n\)个字符串是循环同构的。这\(n\)个字符串中字典序最小的一个,我们就称为\(S\)的最小表示。 \(For\ example:\) \(S=abcda,S_1=aabcd,S_2=daab...

weixin_30906671的博客 82
上一篇: Codeforces Round #286 (Div. 1) B. Mr. Kitayuta's Technology 连通分量 拓扑排序
下一篇: poj2828 Buy Tickets 单点更新线段树
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值