口胡 字符串最小等价串

这种东西见过一两次了,稍微口胡一下吧。

定义

什么是最小等价串?

可以理解为把一个字符串中的字符按顺序重新“编号”。

比如说一个字符串S=BBCBA,那么它的最小表示就是T=AABAC

问题

快速判断两个串是否等价(即最小等价串相同)

解析

我们发现问题就在于这个字符可以随便搞,这样随便怎样都会挂。

怎么办呢?能不能反过来利用这个东西?

注意到我们不关心每一种字符具体是什么,只关心它们在哪里出现了。

那么我们可以考虑记last[i]表示字符i上一次出现的位置,第$1$次出现则记为$0$。

不难发现,只要两个字符串对应的i-last[i]相同,它们就是等价的。

比如说字符串S=BBCBA

Source String B B C B A
LAST 0 1 0 2 0
i-LAST 1 1 3 2 5

字符串T=AABAC

Source String A A B A C
LAST 0 1 0 2 0
i-LAST 1 1 3 2 5

说明ST是等价的。

而对于SS=AAABC来说:

source String A A A B C
LAST 0 1 2 0 0
i-LAST 1 1 1 4 5

说明SSS,T是不等价的。

对不对?WO YE BU HUI。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×