zoukankan      html  css  js  c++  java
  • 【学习笔记】最小表示法


    一、最小表示法解决的问题:找到一个字符串的循环同构串中字典序最小的那个串。

    二、字符串的循环同构:
    比如长度为5字符串“abcde”,它的5个循环同构串有:
    abcde,bcdea,cdeab,deabc,eabcd;其中字典序最小的串为“abcde”。

    三、求“abcde”的字典序最小的循环同构串
    1.把“abcde”再接一遍,变成“abcdeabcde”,令s[]=“abcdeabcde”,默认下标从1开始;
    2.设置两个指针,一个指向下方第一个串的第一个字符(i=1),一个指向下方第二个串的第二个字符(j=2)。
    这个指针是我们要找的字典序最小的串的起点。
    abcdeabcde
    abcdeabcde
    如果从i开始(包括i)往后k个字符和从j开始(包括j)往后k个字符都相等,且s [i+k]>s[j+k],那么从i到i+k-1之间的任何一个字符为首字符时,它的字典序一定不是最优的,将i修改为i=i+j+1;

    因为每个指针最多跳转n次,所以时间复杂度为O(n)

    四、代码

        while(i<=6&&j<=6) //字符串长度为6 拼接后为12
        {
            for(k=0;k<6&&b[i+k]==b[j+k];k++);//公共前缀,找到第一个不相等的位置
            if(k==6) break;      
            if(b[i+k]>b[j+k])  
            {
                i+=k+1;       //修改指针
                if(i==j) i++; 
            }
            if(b[i+k]<b[j+k])
            {
                j+=k+1;
                if(i==j) j++;
            }
        }
        int st=min(i,j),ed;
        ed=st+6-1;
    
  • 相关阅读:
    EF中連表查詢的應用方式
    排序刷新及其分頁
    SpringMVC与前台的json数据交互
    最详细的springmvc-mybatis教程
    数据库主从复制
    display:inline、block、inline-block的区别
    Yii框架中有关于layout的说明
    创建yii的第一个应用
    学习bootstrap的总结文章
    数据库事物隔离级别通俗理解
  • 原文地址:https://www.cnblogs.com/zzyh/p/14785281.html
Copyright © 2011-2022 走看看