请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

滑动窗口解法

// 滑动窗口解法
const findSubstring = function (s, words) {
  if (!s.length || !words.length) return []

  // 计算words中单词出现次数
  const wordMap = new Map()
  for (let key of words.values()) {
    wordMap.set(key, wordMap.has(key) ? wordMap.get(key) + 1 : 1)
  }

  const wid = words[0].length // 每个单词长度
  const len = wid * words.length // 窗口长度(单词总长度)
  const result = []
  for (let start = 0; start + len <= s.length; start++) {
    const tmpMap = new Map()

    // 遍历窗口范围内单词 进行判断
    let j = 0
    for (; j < len; j += wid) {
      const tmp = s.substr(start + j, wid)
      if (wordMap.has(tmp)) {
        tmpMap.set(tmp, tmpMap.has(tmp) ? tmpMap.get(tmp) + 1 : 1)
        // 窗口中单词出现次数大于 words中次数 则不成立
        if (tmpMap.get(tmp) > wordMap.get(tmp)) {
          break
        }
      } else {
        break
      }
    }
    if (j === len) {
      result.push(start)
    }
  }
  return result
}

console.log(findSubstring('aaa', ['a', 'a'])) // [0, 1]
console.log(findSubstring('foobarfoobar', ['foo', 'bar'])) // [0, 3, 6]
console.log(findSubstring('barfoothefoobarman', ['foo', 'bar'])) // [0, 9]

正在回答 回答被采纳积分+3

2回答

qq_狼啸_0 2020-11-28 17:36:38

你这还不算滑动窗口解法

0 回复 有任何疑惑可以回复我~
快乐动起来呀 2020-03-21 10:44:44

赞,欢迎将自己的实战中的思考分享给更多人

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信