寻找字符串的最小表示法
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 (最小表示法)
LeetCode 744. 寻找比目标字母大的最小字母 / 307. 区域和检索 - 数组可修改 / 762. 二进制表示中质数个计算置位
2022-02-17:寻找最近的回文数。 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试