LeetCode每日一题,514. Freedom Trail
先看题目描述
大意就是给定两个字符串,一个字符串 ring 表示刻在外环上的编码,另一个字符串 key 表示需要拼接的关键词,让我们算出能够拼写关键词中所有字符的最少步数
算法思路
这题不会,我是直接看的题解…
动态规划
定义 dp[i][j] 表示从前往后拼写出 key 的第 i 个字符, ring 的第 j 个字符与12:00 方向对齐的最少步数(下标均从 0 开始)
显然,只有当字符串 ring 的第 j 个字符和 key 的第 i 个字符相同时才能拼写出 key 的第 i 个字符,因此对于 key 的第 i 个字符,需要考虑其在 ring 中出现的下标集合。我们对每个字符维护一个位置数组 pos[i],表示字符 i 在 ring 中出现的位置集合,用来加速计算转移的过程
对于状态 dp[i][j],需要枚举上一次与 12:00 方向对齐的位置 k,因此可以列出如下的转移方程:
其中 min{abs(j - k), n - abs(j - k)} 表示在当前第 k 个字符与 12:00 方向对齐时第 j 个字符旋转到 12:00 方向并按下拼写的最少步数
最后返回数组 dp[m - 1] 中的最小值即可
算法源码
1 | import java.util.*; |
利用滚动数组优化空间复杂度后的代码
1 | import java.util.*; |
注意在对列表数组 pos 初始化时不能用 Arrays.fill(),否则 pos 中的所有元素实际上指向的是是同一个列表

