算法——最小表示法

最小表示法算法详解

最小表示法用于寻找循环字符串中字典序最小的唯一表示。例如字符串 “abca” 的循环同构形式包括 “abca”、“bcaa”、“caab” 和 “aabc”,其中最小的是 “aabc”。

算法思想

使用双指针 ij 比较不同起点,通过跳过无效比较将时间复杂度优化至 O(n)

  1. 初始化i=0, j=1, k=0
  2. 比较字符:若 s[i+k] > s[j+k],则 i += k+1i 开头的序列不可能更小);反之 j += k+1
  3. 处理平局:若字符相等,k++;若 k == n 说明整个字符串由重复周期构成,终止比较。
  4. 结果:取 ij 中较小的值作为起点。

图形示例

s = "bcabca" 为例(索引从0开始):

索引:0 1 2 3 4 5
字符:b c a b c a
  1. 初始状态i=0, j=1, k=0
    • 比较 s[0] vs s[1]b > ci = 0+0+1 = 1
  2. 新状态i=1, j=1j++j=2, k=0
    • 比较 s[1] vs s[2]c > ai = 1+0+1 = 2
  3. 新状态i=2, j=2j++j=3, k=0
    • 比较 s[2] vs s[3]a < bj = 3+0+1 = 4
  4. 继续比较i=2, j=4, k=0
    • s[2] vs s[4]a < cj = 4+0+1 = 5
  5. 最终比较i=2, j=5, k=0
    • s[2] vs s[5]a == ak=1
    • s[3] vs s[0]b < b 后的循环处理…
    • 最终确定最小起点为 i=2,对应字符串 "abcabc" 的最小表示 "abcbca"

(实际步骤可能更复杂,需逐字符比较)

代码实现(Python)

def minimum_representation(s):
    n = len(s)
    if n == 0:
        return -1  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值