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;
};

回到目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,396评论 0 7
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,689评论 0 4
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,584评论 0 13
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 1,222评论 0 1
  • 表单元素 表单是什么?——表单不是表格。用户可以在其中提供一定的数据或信息或选项的一些html元素。表单通常有一个...
    追逐梦的孩子_759d阅读 258评论 0 0

友情链接更多精彩内容