题目
题目来源:力扣(LeetCode)
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]为smalls[i]出现的所有位置。
示例:
输入:
big = “mississippi”
smalls = [“is”,”ppi”,”hi”,”sis”,”i”,”ssippi”]
输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]
思路分析
- 通过smalls构建Trie树,然后遍历big字符串,在前缀树中寻找匹配项。
- 找到完整字符则将当前的「索引」添加到结果集,其中last为结果集的index。
- 继续向下找,直到匹配不到,big循环完毕
- 如果未能找到则break掉,进入下一个字符的循环。
function TreeNode(val) {
this.val = val || null
this.children = {}
}
/**
* @param {string} big
* @param {string[]} smalls
* @return {number[][]}
*/
var multiSearch = function (big, smalls) {
// 结果集
const res = smalls.map(() => [])
if (!big) {
return res
}
// 构造字典树
let Tree = new TreeNode()
let now;
smalls.forEach((small, index) => {
now = Tree;
for (let i = 0; i < small.length; i++) {
if (!now.children[small[i]]) {
now.children[small[i]] = new TreeNode(small[i])
}
now = now.children[small[i]]
}
now.children['last'] = index
})
// 遍历 big 字符串,在字典树中查找匹配项
for (let i = 0; i < big.length; i++) {
let now = Tree;
for (let j = i; j < big.length; j++) {
if (!now.children[big[j]]) {
break
}
now = now.children[big[j]]
if (now.children.last !== undefined) {
res[now.children.last].push(i)
}
}
}
return res
};