720. 词典中最长的单词

内容

给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。

若无答案,则返回空字符串。

示例 1:

输入:
words = ["w","wo","wor","worl", "world"]
输出: "world"
解释:
单词"world"可由"w", "wo", "wor", 和 "worl"添加一个字母组成。
示例 2:

输入:
words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
输出: "apple"
解释:
"apply"和"apple"都能由词典中的单词组成。但是"apple"得字典序小于"apply"。
注意:

所有输入的字符串都只包含小写字母。
words数组长度范围为[1,1000]。
words[i]的长度范围为[1,30]。


思路

既然是找最长的单词,然后又是一个无序数组,那么首先排序。
然后观察,如果这个最长的单词是有效的,那么它的依次从右侧减去一个字母的组合都应该在数组中存在,这个时候考虑到,如果每次都去这么大的数组中遍历,那么肯定超级慢。所以直接将数组中的所有字符串放入一个对象map中,每次需要判断单词的部分子串是否存在时,就去map中找。
然后还有个问题就是,这种单词可能有多个,这里需要将他们进行一个字符串大小的比较,通过改写一下sort方法即可。


代码

/**
词典中最长的单词

既然是找最长的单词,然后又是一个无序数组,那么首先排序。
然后观察,如果这个最长的单词是有效的,那么它的依次从右侧减去一个字母的组合都应该在数组中存在,这个时候考虑到,如果每次都去这么大的数组中遍历,那么肯定超级慢。所以直接将数组中的所有字符串放入一个对象map中,每次需要判断单词的部分子串是否存在时,就去map中找。
然后还有个问题就是,这种单词可能有多个,这里需要将他们进行一个字符串大小的比较,通过改写一下sort方法即可。
 * @param {string[]} words
 * @return {string}
 */
var longestWord = function (words) {
    var map = {};
    words.sort(function (a, b) {
        return a.length - b.length
    })

    for (var i = 0; i < words.length; i++) {
        map[words[i]] = 1;
    }

    var maxlens = [];
    for (var i = words.length - 1; i >= 0; i--) {
        var now = words[i] || '';
        var next = words[i - 1] || '';
        maxlens.push(now);
        if (now.length > next.length) {
            for (var j = 0; j < maxlens.length; j++) {
                if (!check(maxlens[j])) {
                    maxlens.splice(j, 1);
                    j--;
                }
            }

            if (maxlens.length > 0) {
                maxlens.sort(function (a, b) {
                    return a > b ? 1 : -1;
                })

                return maxlens[0];
            }
        }
    }

    function check(str) {
        for (var i = 0; i < str.length - 1; i++) {
            if (map[str.slice(0, str.length - i - 1)] != 1) {
                return false;
            }
        }

        return true;
    }

    return -1;
};

回到目录

你可能感兴趣的:(720. 词典中最长的单词)