【程序员面试金典】面试题 17.11. 单词距离

【程序员面试金典】面试题 17.11. 单词距离

    • 题目描述
    • 解题思路

题目描述

描述:有个内含单词的超大文本文件,给定任意两个不同的单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?

示例:

输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1

提示:

words.length <= 100000

解题思路

思路:最直观的想法是,遍历一遍数组,分别记录word1所出现的下标数组pos1以及word2所出现的下标数组pos2,由于下标本身是有序的,故pos1和pos2是有序的,那么问题就转换为求解pos1和pos2元素的最小差值,思路类似于面试题16.06。假设m表示数组pos1长度,n表示数组pos2长度,i指向pos1当前元素,j指向pos2当前元素,每次移动当前较小那个元素所对应的指针,从而获取最小差值,即当pos1[i]小于pos2[j]时求取最小差值并将i向后移一位,而当pos2[j]小于pos1[i]时求取最小差值并将j向后移一位,当其中一个遍历结束就无需继续后移了,因为继续向后移差值只会越来越大。

int findClosest(vector& words, string word1, string word2) 
{
  //存放单词一下标位置
  vector pos1;
  //存放单词二下标位置
  vector pos2;
  for(int i=0;ipos2[j])
     {
        dist=min(dist,pos1[i]-pos2[j]);
        j++;
     }
   }
   //其中一个走完就不用走剩余的了 因为随着下标增加 差值只会越来越大
   return dist;
}

优化:其实没必要记录pos1和pos2,直接使用变量i、j分别记录word1、word2最后一次出现的位置即可,当两者均被记录后,则求取最小差值。

int findClosest(vector& words, string word1, string word2) 
{
  //单词1最后一次出现的位置
  int pos1=-1;
  //单词2最后一次出现的位置
  int pos2=-1;
  //记录最大差值
  int dist=INT_MAX;
  for(int i=0;i

总结:再次体验两个数组最小差!

你可能感兴趣的:(程序员面试金典,面试,算法,职场和发展)