字符串最小表示(超时及优化)

最小表示法:环形字符串字典序最小表示的O(n)算法精解 在字符串算法领域,处理循环同构串的字典序比较是一个经典问题。其核心原理在于,通过双指针模拟锦标赛淘汰机制,高效地跳过不可能成为最小表示的起点,从而将时间复杂度从暴力解法的O(n²)优化至O(n)。该算法的技术价值在于,它巧妙地利用了已比较信息,避免了重复计算,是处理环形序列高效比较的典范。在工程实践中,最小表示法广泛应用于字符串匹配、数据去重、生物信息学序列分析等场景。本文以力扣周赛511题目为例,深入剖析了从暴力枚举到双指针优化的完整思维路径,并提供了健壮的算法模板和常见避坑指南,帮助读者彻底掌握这一高频 阅读详情

【题目描述】

把一个长为len的字符串围成一个圈,然后以任意一个字符作为起点,都会产生一个长为len的字符串,字符串的最小表示就是所有字符串中字典序最小的那个。
例如字符串alabala,将它围成一个圈后,根据上面的规则会形成以下新的字符串:
labalaa
abalaal
balaala
alaalab
laalaba
aalabal
在这所有7个字符串中,字典序最小的是aalabal,它的第一个字母在原字符串中的位置是6。(位置从0开始算)
现在给定你一个字符串,请你找出其最小表示的第一个字母在原字符串中的位置。如果字符串最小表示有多个,那么输出第一个字母在原字符串中位置最小的。

【条件限制】

时间限制: 1 Sec  内存限制: 32 MB

【输入】

输入的第一行是一个整数t,表示有t组测试数据。
接下来t行,每行先输入一个整数l(5<=l<=100000),表示原字符串的长度,然后输入一个字符串,表示原字符串。字符串中只包含小写字母。

【输出】

对于每组输入,输出原字符串最小表示的第一个字母在原字符串中的位置。

【输入样例】

2
6 baabaa
7 alabala

【输出样例】

1
6

【优化】

在输入一个字符串之后,先找到该字符串的最小字母,然后对于不是以最小字母开头的字符串省略对其判断,然后代码的运行时间就由原来的2976ms变成了700ms,优化结果并不理想但是ac是够了的,今后若有更好的优化措施再来补充。

【代码】

#include<iostream>
using namespace std;
int main(){
    int n,i,j,len,minpos,nn;
    string str,str1,minstr;
    char minch='z';
    cin>>n;
    for(i=0;i<n;i++){
        cin>>nn>>str;
        len=str.length();
        minstr=str;
        minpos=0;
        for(j=0;j<len;j++){
            if(minch>str[j])
                minch=str[j];
        }
        for(j=1;j<len;j++){
            if(str[j]==minch){
                str1=str.substr(j,len-j)+str.substr(0,j);
                if(minstr>str1){
                    minstr=str1;
                    minpos=j;
                }
            }
        }
        printf("%d\n",minpos);
    }
    return 0;
}


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

相关推荐

【用C++实现SIX/NINE问题】—— 如何在有限时间内自动化解题

总之,SIX/NINE问题看起来很简单,但是实现起来并不容易。非常大时,暴力枚举并检查 k 的值可能需要很长时间,甚至超时。函数在字符串中查找第一个不是字符 ‘6’ 或 ‘9’ 的位置,如果没有找到则返回。的倍数中只含有数字 ‘6’ 和 ‘9’,并且该数字尽可能的小。另一种更有效率的方法是使用数学推导的思路,通过找规律来找到满足条件的最小。SIX/NINE问题是一个经典的数学题目,它的描述如下:给出正整数。很大的时候也会超时,因此我们需要进一步优化。中只包含有数字 ‘6’ 和 ‘9’。

DevEnigma的博客 190

字符串水题(substr的使用+简单优化)

问题 H: 字符串最小表示 时间限制: 1 Sec  内存限制: 32 MB 提交: 7  解决: 5 [提交][状态][讨论版] 题目描述 把一个长为len的字符串围成一个圈,然后以任意一个字符作为起点,都会产生一个长为len的字符串,字符串的最小表示就是所有字符串中字典序最小的那个。 例如字符串alabala,将它围成一个圈后,根据上面的规则会形成以下新的字符串: labalaa

目标就是咸鱼!! 1036

别再拍脑袋估工时了!手把手教你用FPA功能点分析法,给软件项目算笔明白账

本文详细介绍了FPA功能点分析法在软件开发工作量评估中的应用,帮助团队告别拍脑袋估算。通过量化系统功能组件,FPA提供客观的工时和成本预估,特别适合需求不明确的项目初期。文章以财务系统为例,拆解FPA计算流程,并分享实用估算模板,助力技术管理者提升项目规划能力。

weixin_42614269的博客 392

字符串的最小表示法

把一个长为len的字符串围成一个圈,然后以任意一个字符作为起点,都会产生一个新的长为len的字符串,字符串的最小表示就是所有新字符串中字典序最小的那个。 下面这个函数就是解决这个问题的,返回值为字典序最小的串的在原串中的起始位置。 int MinimumRepresentation(char *s,int len) //串s[0~l-1]的最小表示位置{ int i = 0...

baidui8622的博客 329

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1671

别再乱拖了!Godot 4.x 场景编辑器的7个隐藏操作技巧(附快捷键清单)

本文揭示了Godot 4.x场景编辑器的7个隐藏操作技巧,包括智能对齐、轴心点应用、多节点批量操作等,帮助开发者提升游戏开发效率。特别介绍了坐标系切换和自定义快捷键等实用功能,适用于处理复杂场景和团队协作。

weixin_29534421的博客 363

leetcode——第244场周赛—3

给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次: 类型 1 :删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 :选择 字符串 s 中任意一个字符并将该字符 反转 ,也就是如果值为 ‘0’ ,则反转得到 ‘1’ ,反之亦然。 请你返回使 s 变成 交替 字符串的前提下, 类型 2 的 最少 操作次数 。 我们称一个字符串是 交替 的,需要满足任意相邻字符都不同。 比方说,字符串 “010” 和 “1010” 都是交替的,但是字符串 “0100” 不是。 示例 1:

qq_45496907的博客 292

直流无刷减速电机选型指南:从KV值到霍尔传感器,新手必看的5个关键参数

本文详细解析直流无刷减速电机选型的5个关键参数,包括KV值、转矩、电流与功率、减速比选择以及霍尔传感器配置。通过实战案例和避坑策略,帮助工程师精准匹配电机性能与负载需求,提升工业自动化设备的可靠性和效率。特别强调霍尔传感器在精准控制中的关键作用。

alice7model的博客 624

字符串的最小/大表示法

想象一下,把一个字符串围成一个圈,再次字符圈的任意一处断开,将会得到一个新的字符串。在按此法生成的字符串中,字典序最小的称为原字符串的最小表示法,最大的称为原字符串的最大表示法。 那么,我们怎么求一个字符串的最小/大表示法呢? 思路一、 直接把这n个字符串构造出来,然后排序。 时间复杂度O(nlogn)O(nlogn)O(nlogn),空间复杂度O(n2)O(n^2)O(n2),TLE 思路二、 ...

C20181503csy的博客 325

python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(二)

之前的博客已经写了python爬取豆瓣读书top250的相关信息,接下来继续看如何清洗数据。 如果有没看懂的或是不了解上一部分说的是什么内容的,请看https://blog.youkuaiyun.com/qq_45804925/article/details/112848887 现在开始具体内容的复习: 1. 豆瓣读书top250信息预处理 #数据清洗 import pandas as pd import re import time # 先读取数据文件 data = pd.read_csv('E:/Class/商.

qq_45804925的博客 4443

学习 Bootstrap 5 之 Tables

学习 Bootstrap 5 之 表格表格 (Tables)1. 创建表格(1). 使用原生的表格标签(2). 使用Bootstrap 5 的提供的表格标签类(3). 原生与Bootstrap创建出来的表格的对比2. 表格样式(1). 表格样式的效果(2). 表格样式的使用1). 用于 <table> 标签2). 用于 <thead> <tbody> <tfoot> 标签 表格 (Tables) 1. 创建表格 (1). 使用原生的表格标签 <tabl

qq_37354060的博客 2130

最小表示法

http://blog.youkuaiyun.com/runninghui/article/details/11694089 “最小表示法”思想在字符串循环同构问题中的应用(摘自周源的ppt) 前言: “最小表示法”比起动态规划、贪心等思想,在当今竞赛中似乎并不是很常见。但是在解决判断“同构”一类问题中却起着重要的作用。 本文即将讨论字符串中的同构问题,如何巧妙地运用最小表示法来解

u014086857的专栏 611

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析

本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。

weixin_29070861的博客 483

UVa 719 Glass Beads

本题通过最小表示法在线性时间内求出字符串的最小循环移位起始位置,避免了枚举所有移位的平方复杂度。算法利用双指针跳跃策略,确保每个位置最多被跳过有限次,最终得到唯一的最小起始点。该解法适用于长度达100001000010000的字符串,运行效率高,实现简洁。注意输出为111基下标,且若有多个最小移位,算法返回的是最小的iii,因为iii始终保持为当前已确认的最小候选,且当knk = nkn时提前退出,iii为最小的可能起始位置。

寂静山林 171

YOLOv8融合改进 更换检测头为Detect_DyHead同时添加C2f_DBB模块

yolov8独家训练测试融合网络结构,提供详细步骤详细代码,手把手教你在yolov8官方包中把检测头更换为Detect_DyHead检测头,并且将原始的C2f模块更换成C2f_DBB模块,提高检测精度,亲测在多个数据集上有涨点!!!!!

分享一些自己改进代码的实例 4747

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

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

字符串最小表示法

最小表示法的定义: 给定一个字符串,不断地把最后一个元素移到最前面,可得有n个这样的字符串(称这n个字符串是循环同构的),那么最小表示就是这n个里面字典序最小的一个; 怎么求最小表示: Wrong :最朴素的方法,把每一个这样的字符串求出来,然后一一比较,找到字典序最小的循环同构串;然后数据范围变大肯定会超时; 那么正解: O(n); pre:用B[i]来表示以i开头的循环同构串; 1、首先把s复...

altoer的博客 366

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【字符串】最小表示法

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

m0_64526147的博客 521

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最小表示法:高效解决循环字符串字典序最小表示问题

在字符串处理和算法竞赛中,处理循环同构字符串是一个常见需求。其核心问题在于,对于一个给定的字符串,如何高效地找到其所有循环移位中字典序最小的那个表示。传统的朴素方法需要O(n²)的时间复杂度,而最小表示法(Minimum Representation)则利用双指针竞争淘汰的思想,将复杂度优化至O(n)。该算法的技术价值在于其高效性和简洁性,它通过比较和跳跃指针,避免了大量冗余比较,是解决循环字符串规范化问题的标准算法。在应用场景上,它广泛用于力扣周赛等算法竞赛题目、字符串循环同构判断、以及生物信息学中DNA

weixin_33709364的博客 469

备战蓝桥杯国赛——Trie树,哈希,字符串的最小表示

备战蓝桥杯国赛——Trie树,哈希,字符串的最小表示

2502_94043640的博客 390

字符串基础算法详解(kmp,扩展kmp,最小表示法,manachar)

字符串简单算法详解

weixin_73072419的博客 745

最小表示法:O(n)时间解决循环字符串字典序问题

在字符串算法领域,字典序比较是基础且核心的操作,它决定了字符串排序、匹配等一系列问题的解决方式。其原理基于字符的ASCII码或Unicode值逐位比较,广泛应用于数据排序、搜索引擎索引和数据库查询优化。当处理首尾相连的循环字符串时,暴力比较所有循环同构串的字典序会导致O(n²)的时间复杂度,成为性能瓶颈。最小表示法(Minimal Representation)正是针对这一场景的高效算法,它通过双指针跳跃比较,利用已比较信息跳过无效位置,将复杂度优化至O(n)。该算法在力扣周赛等编程竞赛中价值显著,能快速解

weixin_30813225的博客 512

环状字符串的最小字典序(包含booth算法)

本文介绍了寻找环状字符串最小字典序表示的两种算法。基础暴力解法通过逐个比较所有可能的起点,时间复杂度为O(n²)。更高效的Booth算法利用双指针和智能跳跃策略,将复杂度降低到O(n)。两种方法在代码实现上各具特点:暴力法简单直接适合小数据,Booth算法处理大数据更高效。文章通过伪代码和实际示例详细说明了两种算法的实现逻辑和性能差异,建议根据具体场景选择合适方法,特别是在编程竞赛中需要权衡代码复杂度和运行效率。

2401_88544423的博客 958

最小表示法:O(n)时间解决循环字符串字典序比较的算法精讲

在字符串处理领域,字典序比较是基础且核心的操作,它决定了字符串排序、匹配等关键行为的逻辑。其原理是基于字符的编码顺序进行逐位比较,广泛应用于数据排序、搜索引擎索引和数据库查询优化。对于循环字符串(即首尾相连的字符串),判断其所有循环同构串中字典序最小(或最大)的表示,是一个经典问题。暴力枚举所有起点的O(n²)方法在处理大规模数据(如10⁵级别)时效率低下。最小表示法(Minimum Representation)通过双指针贪心策略,巧妙地利用已比较信息跳过无效状态,将时间复杂度优化至O(n),体现了算法竞

weixin_33841722的博客 355

HDU 3374 String Problem(最大最小表示法+kmp)

Time Limit:1000MS Memory Limit:32768KBDescription Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven s

2cm的专栏 490

牛客练习赛36 Rabbit的字符串(最小表示法)

题目链接 题目描述 Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法。 魔法可以选择字符串的任一位置,并将该位置后面的所有字符水平拼接到串首。 例如:对于字符串abcde,可以通过施加魔法得到cdeab。 如果xxx通过施加魔法将字符串的字典序变得严格比之前的小,那么他将拿走这一字符串。 Rabbit想知道自己的字符串会不会被xxx拿走。 输入描述: 第一行一个整数n,表...

Running Bit. 697

O - String Problem KMP 字符串最小表示法

Give you a string with length N, you can generate N strings by left shifts. For example let consider the string “SKYLONG”, we can generate seven strings:String RankSKYLONG 1KYLONGS 2YLONGSK 3...

aocan6909的博客 133
上一篇: B1018 锤子剪刀布 (20分)
下一篇: HOJ-1002 A + B Problem II
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值