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

对于一个字符串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);
}

最小表示法(转自CSDN xiaoc's home)相关推荐

  1. LeetCode每日一题--有序队列(整理最小表示法)

    题目要求: 给定一个字符串 s 和一个整数 k .你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾. 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 . 示例 1: 输入: ...

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

    循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...

  3. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  4. poj1509最小表示法

    题意:       给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 思路:       最小表示法的建档应用,最小表示法很好理解,就点贪心的意思,一开始我们枚举两个起点i,j ...

  5. hdu3374最小表示法+KMP

    题意:       给你一个最长100W的串,然后让你找到最小同构子串,还有最大同构子串的下标,最小同构子串就是把字符串连接成一个环,然后选择一个地方断开,得到的一个ASCII最小的子串(求最大同理) ...

  6. 【运筹学】运输规划、表上作业法总结 ( 运输规划模型 | 运输规划变量个数 | 表上作业法 | 最小元素法 | 差额 Vogel 法 ★ | 闭回路法 ) ★★★

    文章目录 一.运输规划模型 1.产销平衡模型 2.产销不平衡模型 二.运输规划数学模型变量个数 三.表上作业法 四.表上作业法 : 求初始基可行解 1.最小元素法 2.差额法 ( Vogel ) 推荐 ...

  7. 【运筹学】表上作业法 ( 示例 | 使用 “ 最小元素法 “ 找初始基可行解 )

    文章目录 一.运输规划问题 二.找初始基可行解 一.运输规划问题 运输规划问题 : B1\rm B_1B1​ B1\rm B_1B1​ B1\rm B_1B1​ B1\rm B_1B1​ 产量 A1\ ...

  8. 【运筹学】表上作业法 ( 最小元素法分析 | Vogel 方法 )

    文章目录 一." 最小元素法 " 分析 二.Vogel 方法 ( 差额法 ) 一." 最小元素法 " 分析 在上一篇博客 [运筹学]表上作业法 ( 求初始基可行 ...

  9. 【运筹学】表上作业法 ( 求初始基可行解 | 最小元素法 )

    文章目录 一.表上作业法 第一步 : 确定初始基可行解 二.最小元素法 一.表上作业法 第一步 : 确定初始基可行解 运输问题如下 : 下面的表格代表 333 个产地 , 444 个销地 的运输规划问 ...

最新文章

  1. 企业中如何避免因网卡硬件问题产生的损失
  2. VMware虚拟设备之虚拟磁盘配置与虚拟磁盘置备类型相关介绍
  3. [转]用DateTime.ToString(string format)输出不同格式
  4. kafka+zookeeper安装配置
  5. 让IE和Firefox(包括chrome)浏览器默认产生滚动条的滚动槽
  6. SpringBoot2.1.5(7)---更换Banner
  7. cocos2d-x之猜数字游戏
  8. AttributeError: 'Request' object has no attribute 'is_xhr' 报错的解决办法
  9. 实习踩坑之路:集群场景下,我的redis锁为什么不生效啊?别的机器上的线程给解锁了?
  10. iOS和js交互三部曲,很不错的文章和demo
  11. ArcCatalog不能预览地图服务
  12. Leetcode刷题之旅--剑指 Offer 17. 打印从1到最大的n位数
  13. mysql定时自动备份数据库
  14. 卫星影像的RPC参数
  15. java第七章学习笔记:访问控制---java世界的卫兵
  16. 2026年物联网将为运营商带来高收入
  17. 706服务器型号,数据库版本706 此服务器支持661
  18. :after/::after和:before/::before的区别
  19. 教培行业遇冷,他从中职老师转行了软件测试
  20. 单反相机滤镜种类和作用

热门文章

  1. 课程介绍专栏/html5+css/案例演示
  2. Android开发之Windows系统adb环境设置
  3. 如何给我的世界基岩版服务器更换存档
  4. 惠普HP ProDesk 400 G2 加装Intel i211双千兆网卡
  5. 计算机硕士研究生 下一代互联网技术与应用,清华大学出版社-图书详情-《计算机网络与下一代互联网》...
  6. python中集合运算_Python中的集合操作与集合运算
  7. 一个指令周期的四个子阶段
  8. 树莓派+ros_arduino_bridge 运行报错 “[Errno 13] Permission denied“
  9. C-S结构和B-S结构的区别
  10. fontsize/line-hight