寻找字符串的最小表示法

Posted CCSU_Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找字符串的最小表示法相关的知识,希望对你有一定的参考价值。

时间复杂度为O(n),只需要用两个指针遍历一次字符即可找到。(最小表示法即为将字符串首位相接,然后每个点都可作为头,找字典序最小的那个)

#include<bits/stdc++.h>
using namespace std;
const int maxn=2000010;
string str1,str2;
int n;
int find(string str){
    int i=0,j=1;
    while(i<=n&&j<=n){
        int k=0;
        while(k<n&&str[i+k]==str[k+j]){
            k++;
        }
        if(k==n)break;//此处break说明已经找到。
        if(str[i+k]>str[j+k])i+=k+1;//这一步跳转的意思是i到i+k-1与j到j+k-1相同,且str[i+k]>str[j+k],那么i到i+k区间则不可能是最小表示的开头,因为在j到j+k-1中均可找到点替代。故可以直接跳转。
        else j+=k+1;
        if(i==j)j++;
    }
    return min(i,j);//开头位置
}
int main(){
    cin>>str1;
    n=str1.size();
    str1+=str1;//在字符串后面赋值一个相同字符串
    int f=find(str1);
    string str3="";
    for(int i=f;i<f+n;i++){
        str3+=str1[i];
    }
    str3即为最小表示法
}

以上是关于寻找字符串的最小表示法的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1398 1398: Vijos1382寻找主人 Necklace (最小表示法)

Shape Number (最小表示法)

LeetCode 744. 寻找比目标字母大的最小字母 / 307. 区域和检索 - 数组可修改 / 762. 二进制表示中质数个计算置位

2022-02-17:寻找最近的回文数。 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

从搜索文档中查找最小片段的算法?