524. Longest Word in Dictionary through Deleting

Medium
随便写了个自认为很暴力的方法,居然AC了而且速度排在中游吧,吃惊,真的是几百年没有不看答案写出来了,/(ㄒoㄒ)/~~

我一向是推崇逻辑最简单的方法,越straightforward越好,越general越好,总之就是越好理解使用场景越频繁越能通用就越好。我最怕那种特别fancy花哨感的方法,看过之后最多能当天重写一遍,以后完全不会自己用。

首先,确定given string的所有字符,如果dict里某个单词里有string没有的字符,那么它肯定不能由该string删除掉字母变得。这个时候用hashSet装字母,再以此遍历dict的每个单词查就可以。

光是有该单词的所有字母还不能保证就一定能由given string删除字符得到,比如字母顺序不一样, alpepa就不能删成apple. 所以我们用two pointers同时遍历given string和dict word的所有字符,从index == 0开始,如果字符相同,则同时右移;如果字符不同,我们就通过右移given string的指针来“删”, 继续比较。如果退出while循环的时候,dict word的pointer的index是word.length()时,说明我们已经在given string里找到了一个完整的dict word, 也就是说明我们确实可以由given word删字母变为dict word.

找到所有可能由given word变成的dict word之后,我们再找出最长的,并且lexicographical order靠最前的。用Collections.sort就可以实现字母排序,再遍历找maxLen的就可以。

class Solution {
    public String findLongestWord(String s, List<String> d) {
        Set<String> dict = new HashSet<>(d);
        Set<Character> chars = new HashSet<>();
        for (char c : s.toCharArray()){
            chars.add(c);
        }
        List<String> possibleWords = new ArrayList<>();
        for (String str : dict){
            if (str.length() > s.length()){
                continue;
            }
            for (Character c : str.toCharArray()){
                if (!chars.contains(c)){
                    continue;
                }
            }
            int i = 0, j = 0;
            while (i < s.length() && j < str.length()){
                if (s.charAt(i) != str.charAt(j)){
                    i++;
                } else {
                    i++;
                    j++;
                }
            }
            if (j == str.length()){
                possibleWords.add(str);
            }
        }
        int maxLen = 0;
        String res = "";
        Collections.sort(possibleWords);
        for (String st : possibleWords){
            if (st.length() > maxLen){
                maxLen = st.length();
                res = st;
            }
        }
        return res;
    }
}

我的code整理一下简化一下应该就长下面这样,可以先sort.学到了String.compareTo(another string)直接就是Compares two strings lexicographically.

class Solution {
        public String findLongestWord(String s, List<String> dict) {
            Collections.sort(dict, new Comparator<String>(){
                public int compare(String a, String b){
                    if (a.length() == b.length()){
                        return a.compareTo(b);
                    } else {
                    return b.length() - a.length();
                    }
                }
            }); 
            int maxLen = 0;
            String res = "";
            for (String word : dict){
                int i = 0, j = 0;
                while (i < s.length() && j < word.length()){
                    if (s.charAt(i) == word.charAt(j)){
                        i++;
                        j++;
                    } else {
                        i++;
                    }
                }
                if (j == word.length()){
                    if (word.length() > maxLen){
                        maxLen = word.length();
                        res = word;
                    }
                }
            }
            return res;
        }
}

注意一下 我们所说的linear time的complexity是针对于input而言的。所以这里的input就是一个np的,你是字典size,p是给的字符串的长度,所以我们的方法虽然也是np,但它相对于input就是linear time了。

    原文作者:greatfulltime
    原文地址: https://www.jianshu.com/p/f1a2b52854ef
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞