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

循环同构串 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

别再手动翻译PDF了!手把手教你用Zotero PDF Translate插件搞定外文文献(附最新GitHub下载链接)

本文详细介绍如何利用Zotero PDF Translate插件高效翻译外文文献,包括插件安装、配置及多引擎对比。通过划词翻译、段落翻译和全文翻译功能,显著提升科研工作效率,特别适合处理大量英文PDF文献的研究人员。

weixin_33712987的博客 772

FLUENT UDF编译及蒸发冷凝相关问题

蒸发冷凝与相间传质

weixin_48029137的博客 1万+

【字符串】最小表示法

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

m0_64526147的博客 521

Win11实时字幕还能这么玩?手把手教你打造专属‘AI字幕机’,告别视频网站无字幕困扰

本文详细介绍了如何利用Win11的实时字幕功能打造全平台通用的AI字幕系统。通过C#抓取程序、Node.js中转服务和前端展示界面的组合,实现自动抓取系统字幕并实时推送到任意网页视频的方案,有效解决在线视频无字幕的困扰。

weixin_33735077的博客 392

最小最大表示法

用法: 一个首位相连的字符串,我们要寻找一个位置,从这个位置向后形成一个新字符串,我们需要使这个字符串字典序最小。 算法: 有一个字符串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

[附源码]计算机毕业设计Python财务管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程项目运行环境配置:Pychram社区版+py项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。推荐pycharm社区版;3.mysql环境:建议是用5.7版本均可。

巧灵计算机程序设计 1067

告别Modern Standby噩梦:Win11睡眠断网冻结的根源剖析与S3睡眠回归实战

本文深入剖析了Windows 11中Modern Standby(现代待机)模式导致睡眠后断网、系统冻结等问题的根源,指出其与硬件驱动、后台活动的兼容性矛盾。文章提供了通过修改注册表键值强制系统回归稳定S3睡眠状态的详细实战步骤,帮助用户彻底解决睡眠故障,实现可靠的远程访问与挂机任务。

weixin_29210727的博客 606

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

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

ADP+Pi==ATP 2362

Android 13 系统定制:实现第三方Launcher预置与原生Launcher3的共存切换

本文详细介绍了在Android 13系统中实现第三方Launcher预置与原生Launcher3共存切换的技术方案。通过修改ResolverActivity逻辑、处理首次启动设置以及优化用户切换机制,开发者可以灵活定制默认Launcher,同时保留用户自由选择权。文章还提供了常见问题排查指南和性能优化建议,帮助提升双Launcher方案的稳定性和用户体验。

weixin_30275415的博客 127

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

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

pi9nc的专栏 806

matlab 受约束的 Delaunay 三角剖分【2025最新版】

matlab内置调用函数实现受约束的 Delaunay 三角剖分并将结果保存为STL文件

点云侠的博客 1875

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5288

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

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

weixin_34335458的博客 328

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

weixin_30408309的博客 84

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

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

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

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

weixin_33805992的博客 444

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

用最小表示法返回最小表示串(字典序最小的同构串)第一个字符在原始串中的下标。   用两个指针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、付费专栏及课程。

余额充值