列表

详情


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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minimumDistance(string word) { } };

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));
  }
};

上一题