244. Shortest Word Distance II

因为要多次查询,每次都遍历肯定不行,所以要保存信息。

最直接的就是保存每个string出现的位置,查询A,B的时候就直接比较他们所有的出现INDEX中最小的情况。

有一点需要注意的是,A出现的位置和B出现的位置都是按顺序添加的,从小到大。
假设M是A出现的一个位置,N是B出现的一个位置,我们首先更新M和N的距离情况。然后看M和N谁小,小的只有变大才有可能得到更符合要求的结果(距离更小), 所以只改变当前INDEX小的string,找到它的下一次出现位置。。

public class WordDistance 
{
    Map<String, List<Integer>> map;
    int length;
    public WordDistance(String[] words) 
    {
        length = words.length;
        if(length == 0) return;
        map = new HashMap<String,List<Integer>>();
        
        for(int i = 0; i < words.length;i++)
        {
            if(map.containsKey(words[i]))
            {
                map.get(words[i]).add(i);
            }
            else
            {
                List<Integer> tempList = new ArrayList<>();
                tempList.add(i);
                map.put(words[i],new ArrayList<>(tempList));
            }
        }
    }

    public int shortest(String word1, String word2) 
    {
        
        List<Integer> list1 = map.get(word1);
        List<Integer> list2 = map.get(word2);
        
        int l = 0;
        int r = 0;
        int res = Math.abs(list1.get(l) - list2.get(r));
        
        while(l < list1.size() && r < list2.size())
        {
            res = Math.min(res,Math.abs(list1.get(l) - list2.get(r)));
            if(res == 1) return 1;
            
            if(list1.get(l) < list2.get(r)) l++;
            else r++;
            
        }
        
        return res;
  
    }
}

这个题卡了一会……一开始想的是建图。。最短路径,不知道怎么想的。。

原文地址:https://www.cnblogs.com/reboot329/p/5968418.html