243. Shortest Word Distance

本文介绍了一种高效算法,用于计算给定单词列表中两个特定单词之间的最短距离。通过跟踪最近遇到的两个目标单词的位置,该算法能够在一次遍历内解决问题。
Given a list of words and two words word1 and word2, return the shortest distance between these two words in the list.
For example,

Assume that words = ["practice", "makes", "perfect", "coding", "makes"].
Given word1 = “coding”word2 = “practice”, return 3.
Given word1 = "makes"word2 = "coding", return 1.

一开始想复杂了 总想直接找到最相近的两个索引
    public int shortestDistance(String[] words, String word1, String word2) {
        List<Integer> list = new ArrayList<>();
        TreeSet<Integer> set = new TreeSet<>();
        for (int i=0; i<words.length; i++) {
            if (words[i].equals(word1)) {
                list.add(i);
            } else if (words[i].equals(word2)) {
                set.add(i);
            }
        }
        
        int min = Integer.MAX_VALUE;
        for (Integer n : list) {
            Integer small = set.floor(n);
            if (small != null) min = Math.min(min, n-small);
            Integer big = set.ceiling(n);
            if (big != null) min = Math.min(min, big-n);
        }
        return min;
    }
实际上不需要这样 只要找出所有word的索引 遍历求差值就可以了
public int shortestDistance(String[] words, String word1, String word2) {
    int i1 = -1, i2 = -1;
    int minDistance = words.length;
    int currentDistance;
    for (int i = 0; i < words.length; i++) {
        if (words[i].equals(word1)) {
            i1 = i;
        } else if (words[i].equals(word2)) {
            i2 = i;
        }

        if (i1 != -1 && i2 != -1) {
            minDistance = Math.min(minDistance, Math.abs(i1 - i2));
        }
    }
    return minDistance;
}

### 问题解析 词梯问题的核心是找到从一个单词到另一个单词的最短变换序列,其中每个相邻单词之间只能有一个字母不同。为解决此问题,可以将单词之间的关系建模为图结构,并使用广度优先搜索(BFS)算法来寻找最短路径。 以下是一个完整的代码框架,包含构建单词关系图、实现BFS和遍历方法的步骤[^1]。 --- ### 代码实现 ```python from collections import defaultdict, deque class WordLadder: def __init__(self, word_list): self.word_list = word_list self.graph = defaultdict(list) self.build_graph() def build_graph(self): # 构建单词关系图 for word in self.word_list: for i in range(len(word)): pattern = word[:i] + '*' + word[i+1:] self.graph[pattern].append(word) def bfs(self, start_word, end_word): # 广度优先搜索 (BFS) 实现 queue = deque([(start_word, [start_word])]) # 队列存储当前单词和路径 visited = set([start_word]) # 记录已访问的单词 while queue: current_word, path = queue.popleft() if current_word == end_word: return path # 找到目标单词,返回路径 for i in range(len(current_word)): pattern = current_word[:i] + '*' + current_word[i+1:] for neighbor in self.graph[pattern]: if neighbor not in visited: visited.add(neighbor) queue.append((neighbor, path + [neighbor])) return None # 如果没有找到路径,返回 None def traverse(self, start_word, end_word): # 遍历函数,调用 BFS 方法并打印结果 shortest_path = self.bfs(start_word, end_word) if shortest_path: print("最短单词变化序列:", " -> ".join(shortest_path)) else: print("无法找到从 {} 到 {} 的单词变化序列".format(start_word, end_word)) # 示例用法 word_list = ["FOOL", "POOL", "POLL", "POLE", "PALE", "SALE", "SAGE"] ladder = WordLadder(word_list) ladder.traverse("FOOL", "SAGE") ``` --- ### 代码说明 1. **构建单词关系图**: - 使用 `defaultdict` 存储模式(pattern)与单词的映射关系。 - 每个单词通过替换一个字母生成多个模式,所有匹配同一模式的单词被视为邻居[^2]。 2. **广度优先搜索(BFS)**: - 初始化队列,存储当前单词及其路径。 - 使用 `visited` 集合记录已访问的单词,避免重复访问。 - 当找到目标单词时,立即返回路径。 3. **遍历函数(traverse)**: - 调用 `bfs` 方法计算最短路径。 - 如果存在路径,则打印路径;否则提示无法找到路径。 --- ### 示例输出 假设输入单词列表为 `["FOOL", "POOL", "POLL", "POLE", "PALE", "SALE", "SAGE"]`,调用 `ladder.traverse("FOOL", "SAGE")` 将输出: ``` 最短单词变化序列: FOOL -> POOL -> POLL -> POLE -> PALE -> SALE -> SAGE ``` 如果输入的目标单词无法通过变换序列到达,则输出类似以下内容: ``` 无法找到从 FOOL 到 ZZZZ 的单词变化序列 ``` --- ### 注意事项 - 确保输入的单词列表中包含起始单词和目标单词,否则可能无法找到路径。 - 单词长度必须一致,否则无法正确构建图结构[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值