题目

题目来源:力扣(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]]

思路分析

  1. 通过smalls构建Trie树,然后遍历big字符串,在前缀树中寻找匹配项。
  2. 找到完整字符则将当前的「索引」添加到结果集,其中last为结果集的index。
  3. 继续向下找,直到匹配不到,big循环完毕
  4. 如果未能找到则break掉,进入下一个字符的循环。
  1. function TreeNode(val) {
  2. this.val = val || null
  3. this.children = {}
  4. }
  5. /**
  6. * @param {string} big
  7. * @param {string[]} smalls
  8. * @return {number[][]}
  9. */
  10. var multiSearch = function (big, smalls) {
  11. // 结果集
  12. const res = smalls.map(() => [])
  13. if (!big) {
  14. return res
  15. }
  16. // 构造字典树
  17. let Tree = new TreeNode()
  18. let now;
  19. smalls.forEach((small, index) => {
  20. now = Tree;
  21. for (let i = 0; i < small.length; i++) {
  22. if (!now.children[small[i]]) {
  23. now.children[small[i]] = new TreeNode(small[i])
  24. }
  25. now = now.children[small[i]]
  26. }
  27. now.children['last'] = index
  28. })
  29. // 遍历 big 字符串,在字典树中查找匹配项
  30. for (let i = 0; i < big.length; i++) {
  31. let now = Tree;
  32. for (let j = i; j < big.length; j++) {
  33. if (!now.children[big[j]]) {
  34. break
  35. }
  36. now = now.children[big[j]]
  37. if (now.children.last !== undefined) {
  38. res[now.children.last].push(i)
  39. }
  40. }
  41. }
  42. return res
  43. };