返回

策略制胜:玩转821. 字符的最短距离,开启探索字符世界的奇妙之旅

后端







**踏入字符世界,探索最短距离** 

821. 字符的最短距离题目的背景设定在一个由字母组成的矩阵中,您的目标是找到任意两个不同字符之间的最短距离。在这个字符世界里,每个字母占据一个单元格,字符之间的距离则由它们的曼哈顿距离决定。

**策略一:从「遍历」入手,构建字符地图** 

要解开这道题目的谜题,我们首先需要从「遍历」入手,对字符矩阵进行全面勘探。我们可以使用双重循环遍历每个单元格,并记录每个字母的位置。这样一来,我们就构建了一张字符地图,为后续的距离计算打下坚实的基础。

**策略二:巧用「广度优先搜索」,丈量字符距离** 

有了字符地图,我们就可以运用广度优先搜索 (BFS) 算法来计算任意两个不同字符之间的最短距离。BFS 算法以源节点为起点,逐层向外扩展,直到找到目标节点。在这个过程中,我们会记录每个节点的距离,并最终找到最短距离。

**Python代码,助您轻松破题** 

```python
def shortest_distance(grid, char1, char2):
    """
    计算两个字符之间的最短距离

    Args:
        grid (list): 字符矩阵
        char1 (str): 第一个字符
        char2 (str): 第二个字符

    Returns:
        int: 最短距离
    """
    # 构建字符地图
    char_map = {}
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] not in char_map:
                char_map[grid[i][j]] = []
            char_map[grid[i][j]].append((i, j))

    # 广度优先搜索
    queue = [(char_map[char1][0], 0)]
    visited = set()
    while queue:
        # 弹出队首元素
        node, distance = queue.pop(0)

        # 标记已访问
        visited.add(node)

        # 检查是否到达目标节点
        if grid[node[0]][node[1]] == char2:
            return distance

        # 扩展相邻节点
        for neighbor in [(node[0] + 1, node[1]), (node[0] - 1, node[1]), (node[0], node[1] + 1), (node[0], node[1] - 1)]:
            if neighbor not in visited and 0 <= neighbor[0] < len(grid) and 0 <= neighbor[1] < len(grid[0]):
                queue.append((neighbor, distance + 1))

    # 未找到路径
    return -1


# 示例
grid = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
char1 = 'a'
char2 = 'i'
result = shortest_distance(grid, char1, char2)
print(f"最短距离:{result}")

收官之笔,总结解题要诀

通过对「遍历」和「广度优先搜索」的巧妙结合,我们成功地找到了字符之间的最短距离。解题的关键在于对字符地图的构建和 BFS 算法的熟练运用。希望这篇文章能为您的算法之旅增添一份信心,让您在字符世界的探索中勇往直前!