LittleElephantAndString

作者:袁伟强

关键词:字符串

题目简述

给两个长度相等的字符串,每次可以在中任选一个字符并移到串的开头。求将变成的最小操作次数(无解返回)。

只包含大写字母

算法

我们先来看看什么时候无解。如果存在一种字母,它在中出现的次数不同,那显然是无解的。如果每种字母在中出现的次数都相同,那么可以将中的字母和中的字母建立起一一对应关系,从后往前枚举中的每个字母,将中与之对应的字母移到的开头,这样就能将变成了。至此,我们证明了有解的充要条件是每种字母在中出现的次数都相同。

下面所要求的就是最优解了。注意到,移动一个字母并不会改变其他字母的相对顺序,也就是说,对于一个字母,只有最后一次移动是有效的,所以,在最优解中,每个字母最多只被移动了一次。下面,我们来看看那些字母可以不用被移动。首先,不被移动的字母一定是B的后缀。而移动其他字母,并不会改变这些字母的相对顺序,因此,的这个后缀必须为的子序列。而如果知道的某个后缀是的子序列,仿照之前证明有解的充分条件,发现只要移动其他字母,必能将变成

至此,问题已经转化成求的最长后缀,使得其为的子序列。这个问题十分容易,我们只需从后往前枚举的每个字母,同时在中维护一个指针从后往前扫过去,时间复杂度

results matching ""

    No results matching ""