Rotating Substrings
题意
给定两个等长的字符串 a , b a,b a,b (长度至多2000),对第字符串 a a a 可以做如下操作:将一个字串向右旋转一格,问最少几次操作将其变成 b b b 字符串。
观察
旋转操作过于丑陋,事实上观察容易发现,对区间 [ l , r ] [l,r] [l,r] 旋转,等价于将 a r a_r ar 移到 a l a_l al 前面,此外没有影响。
分析
先考虑可行性,显然如果两个字符串各个字符数量不一致则无解,反之一定有解。
再分析如何求解最优解。事实上旋转操作可以视为将一个元素挑出来,移到前面的任何位置。可以发现,元素只能向前移,不能向后移,所以后面的元素一定先于前面的元素确定,考虑从后向前推。
不失一般性,考虑特定的两位 a i , b j a_i,b_j ai,bj , 假设其后的内容已经被确定,考虑完成之前的内容的匹配需要的次数,记为 d p ( i , j ) dp(i,j) dp(i,j),那么有如下三种情况
- d p ( i , j ) = d p ( i − 1 , j ) + 1 dp(i,j) = dp(i-1,j)+1 dp(i,j)=dp(i−1,j)+1 :即花费 1 1 1 的代价将 a i a_i ai 移动到之前某个位置
- d p ( i , j ) = d