class Solution {
public:
int minimumDistance(string word) {
}
};
1320. 二指输入的的最小距离
二指输入法定制键盘在 X-Y 平面上的布局如上图所示,其中每个大写英文字母都位于某个坐标处。
给你一个待输入字符串 word
,请你计算并返回在仅使用两根手指的情况下,键入该字符串需要的最小移动总距离。
坐标 (x1,y1)
和 (x2,y2)
之间的 距离 是 |x1 - x2| + |y1 - y2|
。
注意,两根手指的起始位置是零代价的,不计入移动总距离。你的两根手指的起始位置也不必从首字母或者前两个字母开始。
示例 1:
输入:word = "CAKE" 输出:3 解释: 使用两根手指输入 "CAKE" 的最佳方案之一是: 手指 1 在字母 'C' 上 -> 移动距离 = 0 手指 1 在字母 'A' 上 -> 移动距离 = 从字母 'C' 到字母 'A' 的距离 = 2 手指 2 在字母 'K' 上 -> 移动距离 = 0 手指 2 在字母 'E' 上 -> 移动距离 = 从字母 'K' 到字母 'E' 的距离 = 1 总距离 = 3
示例 2:
输入:word = "HAPPY" 输出:6 解释: 使用两根手指输入 "HAPPY" 的最佳方案之一是: 手指 1 在字母 'H' 上 -> 移动距离 = 0 手指 1 在字母 'A' 上 -> 移动距离 = 从字母 'H' 到字母 'A' 的距离 = 2 手指 2 在字母 'P' 上 -> 移动距离 = 0 手指 2 在字母 'P' 上 -> 移动距离 = 从字母 'P' 到字母 'P' 的距离 = 0 手指 1 在字母 'Y' 上 -> 移动距离 = 从字母 'A' 到字母 'Y' 的距离 = 4 总距离 = 6
提示:
2 <= word.length <= 300
word[i]
都是一个大写英文字母。原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 3.2 MB, 提交时间: 2023-06-25 14:42:17
func minimumDistance(word string) int { if len(word) < 3 { return 0 } dp := make([][]int, len(word)) for i := 0; i < len(word); i++ { dp[i] = make([]int, 26) for j := 0; j < 26; j++ { dp[i][j] = math.MaxInt32 >> 1 } } for i := 0; i < 26; i++ { dp[0][i] = 0 } var ans = math.MaxInt32 for i := 1; i < len(word); i++ { cur := int(word[i] - 'A') prev := int(word[i-1] - 'A') d := distance(prev, cur) for j := 0; j < 26; j++ { dp[i][j] = min(dp[i][j], dp[i - 1][j] + d) if prev == j { for k := 0; k < 26; k++ { d0 := distance(k, cur) dp[i][j] = min(dp[i][j], dp[i - 1][k] + d0) } } } } for i := 0; i < 26; i++ { if ans > dp[len(word)-1][i]{ ans = dp[len(word)-1][i] } } return ans } func min(a, b int) int { if a < b { return a } return b } func abs(a int) int { if a < 0 { return -a } return a } func distance(i, j int) int { a, b := [2]int{i / 6, i % 6}, [2]int{j / 6, j % 6} return abs(a[0]-b[0]) + abs(a[1]-b[1]) }
javascript 解法, 执行用时: 68 ms, 内存消耗: 41.4 MB, 提交时间: 2023-06-25 14:41:16
/** * @param {string} word * @return {number} */ const minimumDistance = word => { const LEN = word.length; const dp = new Uint16Array(LEN - 1); let sum = 0 for (let j = 2; j < LEN; ++j) { sum += distance(j - 2, j - 1); let min = sum; for (let i = 0; i < j - 1; ++i) { const min2 = dp[i] + distance(i, j); dp[i] = dp[i] + distance(j - 1, j); if (min2 < min) min = min2; } dp[j - 1] = min; } return Math.min(...dp, sum); function distance(a, b) { const x = word.charCodeAt(a) - 65; const y = word.charCodeAt(b) - 65; return Math.abs((x % 6) - (y % 6)) + Math.abs(((x / 6) << 0) - ((y / 6) << 0)); } };