内容
给出一个字符串数组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;
};
网友评论