跳到主要内容

514.自由之路

链接:514.自由之路
难度:Hard
标签:深度优先搜索、广度优先搜索、字符串、动态规划
简介:给定一个字符串 ring ,表示刻在外环上的编码;给定另一个字符串 key ,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。

题解 1 - javascript

  • 编辑时间:2020-11-11
  • 执行用时:140ms
  • 内存消耗:45.82MB
  • 编程语言:javascript
  • 解法介绍:dp。
const getIdx = (str, v) => str.codePointAt(v) - 'a'.codePointAt(0);
var findRotateSteps = function(ring, key) {
const n = ring.length, m = key.length;
const pos = new Array(26).fill(0).map(v => []);
for (let i = 0; i < n; ++i) {
pos[getIdx(ring, i)].push(i);
}
const dp = new Array(m).fill(0).map(v => new Array(n).fill(Number.MAX_SAFE_INTEGER));
for (const i of pos[getIdx(key, 0)]) {
dp[0][i] = Math.min(i, n - i) + 1;
}
for (let i = 1; i < m; ++i) {
for (const j of pos[getIdx(key, i)]) {
for (const k of pos[getIdx(key, i - 1)]) {
dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + Math.min(Math.abs(j - k), n - Math.abs(j - k)) + 1);
}
}
}
return dp[m - 1].reduce((pre, cur) => Math.min(pre, cur), Number.MAX_SAFE_INTEGER);
};

题解 2 - python

  • 编辑时间:2024-01-29
  • 执行用时:108ms
  • 内存消耗:17.4MB
  • 编程语言:python
  • 解法介绍:dfs。
class Solution:
def findRotateSteps(self, ring: str, key: str) -> int:
arr = defaultdict(list)
for i in range(len(ring)):
arr[ring[i]].append(i)
@cache
def dfs(i1: int, i2: int) -> int:
if i2 == len(key): return 0
if ring[i1] == key[i2]: return dfs(i1, i2 + 1) + 1
return min(
dfs(next_i, i2 + 1) + min(abs(i1 - next_i), len(ring) - abs(i1 - next_i)) + 1
for next_i in arr[key[i2]]
)
return dfs(0, 0)