持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
前言
又是早起刷算法的一天,每天7点准时头疼,理解题目就要花2小时,哎
题目:单词距离
改题是出自leetcode的面试题 17.11. 单词距,属于中等题范围
题目解析
有个内含单词的超大文本文件,给定任意两个不同的单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?
本身是个java开发所以我也不会使用其他语言来做题了,主要以java来解题,各位看思路即可。
这里我的解题思路是先定义好两个索引位置,把他们各自置为一个不存在的坐标,在循环体执行时每次判断一下当前单词是否为题目要找的那个单词,word1 与 word2如果是的话就更新他们的下标,把index1 与 index2刷新。最后结果只需要每次取他们之间的最小值即可。做了一次abs是因为有可能为负数距离也就是单词2出现的比较前所以取一个绝对值。我这个算法其实属于暴力一派了。
官方思路是可以采取hash表来存储记录,遍历一次文件,按照下标递增顺序得到每个单词在文件中出现的所有下标,只要得到两个单词的下标列表,使用双指针遍历两个下标链表,也可以得到两个单词的最短距离。官方题解的会更加进阶一些,条条大路通罗马慢慢优化吧。
我给出的解法
class Solution {
public int findClosest(String[] words, String word1, String word2) {
int index1 = -1, index2 = -1;
int result = Integer.MAX_VALUE;;
for (int i = 0; i < words.length; i++) {
if (words[i].equals(word1) ) {
index1 = i;
}
if (words[i].equals(word2)) {
index2 = i;
}
if (index1 >= 0 && index2 >= 0) {
result = Math.min(result, Math.abs(index1 - index2));
}
}
return result;
}
}