243,244,245. Shortest Word Distance

https://leetcode.com/problems/shortest-word-distance/description/

image.png

这道题就用到贪心思想。为什么我们从前往后遍历,如果2个要比较的STRING都齐备了。那么一旦一个更新了,就看看距离有没有更新就好了。

public int shortestDistance(String[] all, String s, String e) {
        int p1 = -1,p2=-1;
        int min = Integer.MAX_VALUE;
        for(int i = 0; i < all.length; i++){
            String cur = all[i];
            if(cur.equals(s)){
                p1 = i;
                if(p2 != -1){
                    min = Math.min(min,p1-p2);
                }
            }else if(cur.equals(e)){
                p2 = i;
                if(p1 != -1){
                    min = Math.min(min,p2-p1);
                }
            }
        }
        return min;
    }

follow up : 如果会调用多次。那么就用HASHMAP 把每个STRING出现的次数存下来。

Map<String,List<Integer>> map = new HashMap<>();
    public WordDistance(String[] words) {
        int idx = 0;
        for(String w : words){
            map.putIfAbsent(w,new ArrayList<>());
            map.get(w).add(idx++);
        }
    }
    
    public int shortest(String word1, String word2) {
        List<Integer> a = map.get(word1);
        List<Integer> b = map.get(word2);
        int i = 0, j = 0;
        int min = Integer.MAX_VALUE;
        while(i < a.size() && j < b.size()){
            int p1 = a.get(i);
            int p2 = b.get(j);
            if(p1<p2){
                i++;
            }else{
                j++;
            }
            min = Math.min(min,Math.abs(p1-p2));
        }
        return min;
    }

follow up : 如果允许重复的单词
那么就重复的单词,单独写一个逻辑。
第一个记录好后,第二个来了就更新MIN,随后把第一个赋值给第二个,继续等下一个‘’第二个‘’

public int shortestWordDistance(String[] all, String s1, String s2) {
        int p1 = -1, p2 = -1;
        int min = Integer.MAX_VALUE;
        if(s1.equals(s2)){
            for(int i = 0; i < all.length; i++){
                String cur = all[i];
                if(!cur.equals(s1)) continue;
                if(p1 == -1){
                    p1 = i;
                }else if(p2 == -1){
                    p2 = i;
                    min = Math.min(min, p2-p1);
                    p1 = p2;
                    p2 = -1;
                }
            }
        }else{
            for(int i = 0; i < all.length; i++){
                String cur = all[i];
                if(s1.equals(cur)){
                    p1 = i;
                    if(p2 != -1)
                        min = Math.min(min, p1-p2);
                }else if(s2.equals(cur)){
                    p2 = i;
                    if(p1 != -1)
                        min = Math.min(min, p2-p1);
                }
            }
        }
        return min;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,448评论 18 399
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,902评论 0 2
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,695评论 0 89
  • 2018年4月4日(阴天)星期二 早上起来天气还好,孩子们上学都走了,我也收拾一下去上班。刚到单位就开始起风了,天...
    吉怡晨妈妈阅读 2,563评论 0 0
  • 我早早的找到了自己的人生伴侣,让自己能够在家庭生活中安定下来。非常感恩我的伴侣。他对我的爱和耐心像家长一样,无私奉...
    爱一萌阅读 1,472评论 0 0

友情链接更多精彩内容