最小表示法

21 篇文章 0 订阅
2 篇文章 0 订阅
搞了一下最小表示法~~
具体就是一个字符串首位相连成一个环,然后问从哪里断开它的字典序最小
暴力做法就是枚举。O(N^2);
优化一下
第一种优化,把每种可能的字符串列出来,然后qsort
O(Nlogn) 但由于是字符串比较,所以常数会有点大;
接下来介绍一种O(N)的算法~
i,j是两个指针 i表示当前找到的最优解 j表示要试探的
初始i=1 j=2
如果s[i]>s[j],那么就把i更新成j
如果s[i]<s[j],那么j找下一位

如果s[i]=s[j],则。。见程序吧,,懒得说了。。

function ans(s:string):longint;
var ni,nj,i,j,k:longint;
begin
	i:=1; j:=2; k:=0;
	while ((i<=length(s)) and (j<=length(s)) and (k<length(s))) do
		begin
			if i=j then inc(i);
			ni:=(i+k-1) mod length(s)+1;
			nj:=(j+k-1) mod length(s)+1;
			if s[ni]>s[nj] then begin
									inc(i,k+1);
									k:=0;
								end;
			if s[ni]<s[nj] then begin
									inc(j,k+1);
									k:=0;
								end;
			if s[ni]=s[nj] then inc(k);
		end;
	exit(i);
end;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值