字符串循环同构的最小表示法(转)
循环字符串的最小表示法的问题可以这样描述:
对于一个字符串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 MinimumRepresentation(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 < j ? i : j);
- }
http://acm.timus.ru/problem.aspx?space=1&num=1423
这个题目可以练练手,也可用KMP
转载于:https://www.cnblogs.com/PegasusWang/archive/2013/05/28/3104851.html
字符串循环同构的最小表示法(转)相关推荐
- 字符串处理 —— 最大最小表示法
[概述] 最大最小表示法用于解决字符串的同构问题,其在复杂度为 O(n) 的时间内求出一个字符串的所有同构串中字典序最大(小)的串的起始位置. 应用: 给出 n 个循环字符串判断有多少不同字符串:逐个 ...
- 最小表示法(转自CSDN xiaoc's home)
循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...
- 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
这里的同构是指: 对于两棵树A, B,如果能通过重新标号使得两棵树完全相同,则称树A和B同构 Hash最小表示法步骤: ①暴力每个节点为根 ②对于当前根x,对树进行DFS ③DFS时对每个节点维护一个 ...
- UVA - 1314 Hidden Password(最小表示法)
题目链接:点击查看 题目大意:给出一个字符串,求其最小表示法所代表的下标 题目分析:最小表示法的模板题,因为N给到了1e5,如果是正常的求最小值的话,时间复杂度是n*lens级别的,但最小表示法可以利 ...
- HDU - 3374(最小表示法+最大表示法)
hdu3374 题意: 给你一个字符串,问这个字符串经过移动后的字典序最小的字符串的首字符位置和字典序最大的字符串的首字符的位置,和能出现多少次最小字典序的字符串和最大字典序的字符串 题解: 利用最小 ...
- 几个冷门字符串算法的学习笔记(最小表示法,exKMP,Lyndon Word)
所有下标均从1开始 最小表示法 给定一个串,求字典序最小的循环同构. 我们把串复制一遍接在后面,然后求出[1,N][1,N][1,N]开始的长为NNN的子串中最小的 先设i=1,j=2i=1,j=2i ...
- BZOJ1398: Vijos1382寻找主人 Necklace 字符串最小表示法
Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果 ...
- 牛客练习赛36 Rabbit的字符串(最小表示法)
题目链接 题目描述 Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法. 魔法可以选择字符串的任一位置,并将该位置后面的所有字符水平拼接到串首. 例如:对于字符串abcde,可 ...
- 树的同构模板题(法1.最小表示法+法2.树哈希)
树的同构 problem solution code solution code problem 模板题 solution Ⅰ. 最小表示法 将树转化为 0/10/10/1 括号序列:从根开始 dfs ...
最新文章
- R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包将图像、文本、表格组合在一起展示
- 交互式电子杂志_交互环境中电子杂志的生存发展探析
- Struts2与Spring、Hibernate三者整合的过程示例
- php多个进程写文件路径,php 控制多个进程同时读写一个文件
- 告别遥控器,BBC 试验用大脑调台
- 华为零售商品识别一等奖方案
- 单例模式【饿汉模式和懒汉模式异同点】
- 浅谈Android自定义View
- 网站公安备案需要多久?- 桃源侠
- 文本识别综述 <软件学报_王建新等、中国图象图形学报_刘崇宇等>
- 在STEAM上玩电路仿真
- gmoj 5405.Permutation(线段树+拓扑排序)
- php培训月度总结,PHP常量,数组和分支语句小结--PHP培训十期线上班
- Google Code注册方法详解 Google Code网盘申请方法 1
- 服务器硬盘选金盘好吗,WD 西部数据 企业级 10T金盘与8T金盘 对比测试
- java读Excel转List对象
- 往服务器抛数以及从服务器读数(AL11的具体用法)
- 实验一:贝叶斯网络及其应用
- trw2000帮助文档
- 2019年12月四六级百度云