2021SC@SDUSC
使用桶可以有效进行性能优化.
题面:
给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 。
补全词 是一个包含 licensePlate 中所有的字母的单词。在所有补全词中,最短的那个就是 最短补全词 。
在匹配 licensePlate 中的字母时:
忽略 licensePlate 中的 数字和空格 。
不区分大小写。
如果某个字母在 licensePlate 中出现不止一次,那么该字母在补全词中的出现次数应当一致或者更多。
例如:licensePlate = “aBc 12c”,那么它的补全词应当包含字母 ‘a’、‘b’ (忽略大写)和两个 ‘c’ 。可能的 补全词 有 “abccdef”、“caaacab” 以及 “cbca” 。
请你找出并返回 words 中的 最短补全词 。题目数据保证一定存在一个最短补全词。当有多个单词都符合最短补全词的匹配条件时取 words 中 最靠前的 那个。
问题规模:
- 1 <= licensePlate.length <= 7
- licensePlate 由数字、大小写字母或空格 ’ ’ 组成
- 1 <= words.length <= 1000
- 1 <= words[i].length <= 15
- words[i] 由小写英文字母组成
思路:
使用桶
实现测频统计,可将时间复杂度降低为O(n),如果使用include或者indexOf时间复杂度则为O(n^3)
题解:
/**
* @param {string} licensePlate
* @param {string[]} words
* @return {string}
*/
var shortestCompletingWord = function (licensePlate, words) {
let plateBucket = new Array(26).fill(0)
let wordsBucket = new Array(26).fill(0)
let wordsArr = []
let num1 = 0
let code = null
let flag = false
let plateLen = licensePlate.length
let wordsLen = words.length
let wordLen = null
for (let i = 0; i < plateLen; i++) {
code = licensePlate[i].toLowerCase().charCodeAt()
if (licensePlate[i] === ' ' ||
(code >= 48 &&
code <= 57)) {
continue
} else {
plateBucket[code - 'a'.charCodeAt()]++
num1++
}
}
for (let j = 0; j < wordsLen; j++) {
wordLen = words[j].length
if (wordLen >= num1) {
flag = false
wordsBucket = JSON.parse(JSON.stringify(plateBucket))
for (let m = 0; m < wordLen; m++) {
wordsBucket[words[j][m].charCodeAt() - 'a'.charCodeAt()]--
}
flag = wordsBucket.every(ele =>
ele <= 0
)
if (flag) {
wordsArr.push(words[j])
}
}
}
wordsArr.sort((a, b) => {
return a.length - b.length
})
return wordsArr[0]
};