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

循环同构串 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满足上述三个条件,那 阅读详情

循环字符串的最小表示法的问题可以这样描述:

对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。

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

令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 设指针k,分别从i和j位置向下比较,直到S[i] != S[j]
         如果S[i+k] > S[j+k] i=j,j=i+1
         否则j++
返回i

起初,我想在j指针后移的过程中加入一个优化。就是j每次不是加1,而是移动到l位置。其中,l>j且S[l]<=S[j]。但是,即使加入这一优化,在遇到bbb…bbbbbba这样的字符串时复杂度将退化到O(n^2)。

注意到,朴素算法的缺陷在于斜体的情况下i指针的移动太少了。针对这一问题改进就得到了最小表示法的算法。最小表示法的算法思路是维护两个指针i,j。

令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 设指针k,分别从i和j位置向下比较,直到S[i] != S[j]
         如果S[i+k] > S[j+k] i=i+k
         否则j++
返回i和j的小者

注意到上面两个算法唯一的区别是粗体的一行。这一行就把复杂度降到O(n)了。
值得一提的是,与KMP类似,最小表示法处理的是一个字符串S的性质,而不是看论文时给人感觉的处理两个字符串。
应用最小表示法判断两个字符串同构,只要将两个串的最小表示求出来,然后从最小表示开始比较。剩下的工作就不用多说了。

int Minrp(char *s, int l){//s是要处理的字符串,l是字符串s长度
    int i = 0, j = 1, k = 0, t;
    while(i < l && j < l && k < l) {
        t = s[(i+k) >= l ? i+k-l : i+k] - s[(j+k) >= l ? j+k-l : j+k];
        if(!t) k++;
        else{
            if(t > 0) i = i + k + 1;//最大表示的话只要把t>0 改为t<0即可
            else j = j + k + 1;
            if(i == j) j++;
            k = 0;
        }
    }
    return i;
}

附POJ 1509模板,跟ZOJ 1729差不多

#define N 10005
char str[N];
int Minrp(char *s,int l){
    int i=0,j=1,k=0,t;
    while(i<l && j<l && k<l){
        t = s[(i+k) >= l ? i+k-l : i+k] - s[(j+k) >= l ? j+k-l : j+k];
        if(!t)k++;
        else {
            if(t>0)i = i+k+1;
            else j = j+k+1;
            if(i==j)j++;
            k = 0;
        }
    }
    return i;
}
int main(){
    int n;
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",str);
        printf("%d\n",Minrp(str,strlen(str))+1);
    }
    return 0;
}


















最小表示法:O(n)高效处理循环同构字符串的算法精讲 在字符串算法领域,处理循环同构问题是一个经典课题。其核心原理在于,通过双指针贪心比较与‘破环成链’的技巧,可以在O(n)时间复杂度内,为所有循环同构的字符串找到一个唯一的字典序最小代表元。这项技术的价值在于,它提供了一种远超暴力枚举的高效解决方案,极大地优化了字符串匹配与比较的效率。其应用场景广泛,从算法竞赛中的字符串匹配、数据去重,到生物信息学中的基因序列比对,都能见到其身影。本文将以力扣真题为引,深入剖析最小表示法的算法细节与工程实现,帮助你彻底掌握这一处理循环同构字符串的利器。 阅读详情

相关推荐

力扣周赛必备:最小表示法原理与实战,高效解决字符串循环同构问题

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

weixin_30387423的博客 419

算法 循环字符串最小/大表示法(On)

循环字符串的最小表示法的问题可以这样描述:对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。 同构字符串举例:原字符串为abc,同构字符串为abc,bca,cab(类似于徐摆渡,摆渡徐,渡徐摆) 现要输出所有同构字符串中字典序最小/大的一个,以最小表示法为例: 设置双指针i=0, j=1。 如果s[i]>s[j], i=j++; 如果s[i]<s[j], j++;...

weixin_30532987的博客 391

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

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

weixin_30878501的博客 360

循环字符串的最小表示讲解 (POJ 1509 Glass Beads)

循环字符串的最小表示就是:对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。用实际例子来解释:设S=bcad,且S’是S的循环同构的串,则S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。两个字符串的大小比较,如果遇到字符字典序相同就比较下一个,即比较第一个不同的元素谁小。对于字符串循环同构的最小表示,其问题实质是求S串的一个位置,从这个位置开始循环输...

RuanranW 816

HWDB1.1数据集处理全攻略:从gnt文件到PNG图片的完整转换教程

本文提供了HWDB1.1数据集处理的完整教程,详细解析了gnt二进制文件格式,并给出了从文件解析、标签映射到批量转换为PNG图片的Python脚本。教程涵盖了环境准备、跨平台解压方案,以及为PyTorch等深度学习框架准备数据的最佳实践,是进行手写汉字识别研究不可或缺的实用指南。

2w3e4r5t6y的博客 630

PyCharm配置及使用Git教程

平时习惯在Windows下开发,但是我们又需要实时将远方仓库的代码clone到本地,也需要将自己修改的代码push到远端服务器。

酒酿小圆子呀~ 4万+

【字符串】最小表示法

之前做的哈希算法那道雪花的题因为超时而卡了很久,最近学习了最小表示法后,先用最小表示法预处理后复杂度就降低了很多,于是我来总结一下最小表示法的知识点。 概念 对于一个字符串 s, 求 s 的循环的同构字符串中字典序最小的一个字符串,即为最小表示法。 条件 给定一个字符串 s,例如"3 2 4 1 5",求其最小表示法。 题解 可以将字符串 s 中的字符组成一个圈, 他们的顺序可以改变,但他们每个字符之间的相对顺序不能改变,因此,这题的最小表示法答案应该是"1 4 2 3 5",而不是"1

m0_64526147的博客 521

通俗解析:霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器的实战选型指南

本文深入解析了霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器五大主流编码器的工作原理与核心特性。通过对比精度、环境耐受性、成本及寿命等关键维度,并结合消费电子、工业自动化、汽车电子及极端环境等典型应用场景,提供了一份清晰的实战选型指南,旨在帮助工程师根据具体需求,在性能、可靠性与成本间做出最优决策。

weixin_29216353的博客 254

最小最大表示法

用法: 一个首位相连的字符串,我们要寻找一个位置,从这个位置向后形成一个新字符串,我们需要使这个字符串字典序最小。 算法: 有一个字符串str,下标为 0 ~ len 我们这里要i = 0,j = 1,k = 0,表示从i开始k长度和从j开始k长度的字符串相同(i,j表示当前判断的位置) (1) 当str[i + k] == str[j + k] 时 k++; (2) 当str[i] > str[j]时,我们发现i位置比j位置上字典序要大,那么不能使用i作为开头了,我们要将i向后移动,移动多少呢?有因

zhe_zhenbuhui_a的博客 334

软考-高级-信息系统项目管理第四版(完整24章全笔记)

包 括:信息系统、业务应用信息系统、信息安全系统、信息系统工程、业务应用信息系统工程和 信息安全系统工程等业务应用信息系统是支撑业务运营的计算机应用信息系统,信息安全系统工程是指为了达到建设好信息安全系统的特殊需要而组织实施的工程。项目经理由执行组织委派, 负责领导团队实现项目目标。①制定项目章程:②制订项目管理计划:③指导与管理项目工作:④管理项目知识:⑤监控项目工作:⑥实施整体变更控制:项目范围管理过程包括:规划范围管理;收集需求;定义范围;创 建WBS;确认范围;控制范围;

weixin_44934104的博客 3万+

OFDM调制matlab仿真详细代码

MATLAB仿真代码 % ================================================== % 作者: 肆拾伍 % 时间:11/30 2019 % 版本:V3 % =================OFDM仿真参数说明:================ % % 子载波数 carrier_count ---200 % 总符号数 symbol_count ...

肆拾伍的博客 3万+

字符串循环同构——最小表示法の板子

感觉ATP在这两周之内买了不少零食啊会不会长胖或者超预算啊

ADP+Pi==ATP 2362

解决rt-thread上使用SPI+DMA

首先阐述下遇到的问题 使用SPI读取icm20602数据,读取频率为1000hz,使用stm32f407主控,发现CPU占用率达到了70%,将此线程注释掉后CPU占用率掉到25%,看来这里要着重优化,便萌生了使用DMA的想法。 使用SPI+DMA要进行的配置 1.开启RTT设备驱动。点击自己的工程 ->RT-Thread Setting2.在board.hzhong3.在board.c文件里加入以下函数,此函数受设备框架调用 void HAL_SPI_MspInit(SPI_HandleTypeDef

响望的博客 8085

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

【理解字符串循环同构的最小表示法】 分类: ACM/ICPC2010-04-09 16:35 1504人阅读 评论(0) 收藏 举报 算法优化语言工作 循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者ca

pi9nc的专栏 806

Innovus ECO修复时序违例:ecoAddRepeater插Buffer原理与实战

芯片物理设计越到后期,时序收敛越依赖局部修正而非全局重跑。ECO(Engineering Change Order)作为数字后端高频操作,能在不破坏既有布局布线结果的前提下,精准修复DRV违例、hold时序问题或实现功能补丁。其中,插入Buffer或Inverter是拆解长线RC负载、改善max_transition/max_capacitance最直接的手段。Innovus提供的ecoAddRepeater命令封装了单元选择、坐标摆放和网表重连等底层细节,配合ecoRoute可快速完成绕线。合理选型Buf

weixin_31858171的博客 300

UE5Could not be compiled. Try rebuilding from source manually.

UE5Could not be compiled. Try rebuilding from source manually.

weixin_45417260的博客 2770

字符串最小表示法实战:循环同构去重与高效算法实现

字符串处理中,循环同构判定与去重是常见需求,尤其在数据清洗和序列分析场景。其核心原理是通过最小表示法为每个循环串找到字典序最小的唯一代表元,从而将去重问题转化为代表元比较。该算法将单串处理复杂度从O(L²)降至O(L),技术价值在于高效、无冲突且代码简洁。典型应用包括DNA序列归一化、循环日志去重和传感器信号处理。本文围绕经典题目,深入拆解最小表示法的原理、实现细节与性能优化,提供可直接参考的完整方案。

weixin_34335458的博客 328

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

weixin_30408309的博客 84

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

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最小表示法:O(n)求解字符串循环同构与去重统计

字符串循环同构是字符串处理中的基础问题,指两个字符串在循环移位意义下是否相等。其核心原理是通过寻找字典序最小的循环移位作为等价类代表元,利用双指针跳跃比较将复杂度从O(n²)降至O(n)。这一技术价值在于高效判断环状字符串的等价性,广泛应用于字符串匹配、去重统计及环状结构线性化等场景。最小表示法作为标准工具,能快速求解循环同构类数量,是算法竞赛与工程实践中处理字符串循环问题的关键方法。

weixin_33805992的博客 444

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

用最小表示法返回最小表示串(字典序最小的同构串)第一个字符在原始串中的下标。   用两个指针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开头,0str[j+k],把j移到j+k+1,如果

1554

字符串最小表示法:O(n)解决循环同构去重与环形序列规范化

字符串循环同构是指将字符串首尾相连后,通过旋转得到的多个变体。其核心原理是利用双指针扫描,跳过不可能成为最小表示的候选起点,从而在O(n)时间内找到字典序最小的循环移位。该技术能高效解决环形数据去重、DNA序列分析等场景中的规范化问题,避免暴力枚举的O(n²)开销。在日志指纹去重、环形缓冲区比对等工程实践中,最小表示法可将处理速度提升百倍,是字符串算法中兼顾简洁与性能的经典方案。

weixin_33859231的博客 376

最小表示法详解:线性时间求解字符串最小循环同构

在字符串匹配与循环同构问题中,如何高效判断两个环状序列是否等价?最小表示法是一种基于双指针的线性算法,能在O(n)时间内找到字典序最小的循环同构串,代码简洁,无需预处理后缀数组或哈希表。其核心思想是利用已比较的相等前缀,安全跳过大量无效起点,从而将暴力法的O(n²)复杂度降为线性。这一技术价值在项链等价判断、环形数组最小排列、DNA序列比对等场景中尤为突出。相比后缀数组的沉重实现,最小表示法以O(1)额外空间和十几行代码成为处理“最小”与“同构”问题的首选。掌握它,你将拥有解决旋转串类问题的轻量级利器。

weixin_34209060的博客 83
上一篇: 叉积的作用
下一篇: 【字符串最小表示】HDU 3374
leolin_
博客等级 码龄16年 96粉丝 411原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值