字符串的最小表示法

字符串的循环同构:
设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。
对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最小。
显然两个字符串循环同构的充分必要条件是这两个字符串的最小表示法相等。
字符串循环同构可以看这篇论文:点这里~

下面给出求最小表示法的模板:
函数返回一个位置,从这个位置开始循环输出S,得到的S’字典序最小。

int getMin(char *str)
{
    int i=0,j=1,k=0;
    int slen=strlen(str);
    while(i<slen&&j<slen&&k<slen)
    {
        int tmp=str[(i+k)%slen]-str[(j+k)%slen];
        if(tmp==0) k++;
        else
        {
            if(tmp>0) i=i+k+1;
            else j=j+k+1;
            if(j==i) j++;
            k=0;
        }
    }
    return min(i,j);
}

同理,求最大表示法只是把大于等于号的内容改一下

int getMax(char *str)
{
    int i=0,j=1,k=0;
    int slen=strlen(str);
    while(i<slen&&j<slen&&k<slen)
    {
        int tmp=str[(i+k)%slen]-str[(j+k)%slen];
        if(tmp==0) k++;
        else
        {
            if(tmp>0) j=j+k+1;
            else i=i+k+1;
            if(i==j) j++;
            k=0;
        }
    }
    return min(i,j);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,267评论 0 4
  • 不错的博客求next数组: 注意:求next数组得到的最长公共前缀后缀是可以重叠的:比如:ababa,next[5...
    Gitfan阅读 876评论 0 0
  • 字符的 Unicode 表示法 codePointAt() String.fromCodePoint() 字符串的...
    卞卞村长L阅读 761评论 0 0
  • 也许你会看到笑魇如花的我,可永远回会发现我眼眸的忧伤,转身落泪的心痛无人会懂。
    筱晓梦阅读 169评论 0 0
  • 本来想这个周五早点儿入睡,但老公说“今天双十一开始预购,你想买点儿什么吗?”我一但点开页面,有点儿控制不住,就刷天...
    LilyZheng阅读 436评论 1 2