【Day 37 】2021-06-15 - 438. 找到字符串中所有字母异位词

题目描述

438. 找到字符串中所有字母异位词

入选理由

暂无

题目地址

https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/

前置知识

  • Sliding Window
  • 哈希表

题目描述

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
示例 1:

输入:
s: "cbaebabacd" p: "abc"

输出:
[0, 6]

解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。
示例 2:

输入:
s: "abab" p: "ab"

输出:
[0, 1, 2]

解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。

我的回答

回答一

时空复杂度

时间复杂度:O(n*m) 分别是s的长度和p的长度Ï

空间复杂度: O(Max(m,n))

超时了

/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
var findAnagrams = function (s, p) {
    let pMap = {}
    const result = []
    for (let i of p) {
        pMap[i] = (pMap[i] || 0) + 1
    }
    for (let i = 0; i < s.length; i++) {
        let SMap = Object.assign({}, pMap)
        for (let j = i; j < i + p.length; j++) {
            const word = s[j]
            if (!SMap[word]) continue
            SMap[word] = SMap[word] - 1
            if (SMap[word] < 0) continue
            if (SMap[word] === 0) {
                let falg = false
                for (let n in SMap) {
                    if (SMap[n] !== 0) falg = true
                }
                if (!falg) result.push(i)
            }
        }
    }
    return result
};

回答二

时空复杂度

时间复杂度:O(n*m) 分别是s的长度和p的长度Ï

空间复杂度: O(Max(m,n))

超时了

/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
var findAnagrams = function (s, p) {
    let pMap = {}
    const result = []
    for (let i of p) {
        pMap[i] = (pMap[i] || 0) + 1
    }
    for (let i = 0; i < s.length; i++) {
        let SMap = Object.assign({}, pMap)
        for (let j = i; j < i + p.length; j++) {
            const word = s[j]
            if (!SMap[word]) continue
            SMap[word] = SMap[word] - 1
            if (SMap[word] < 0) continue
            if (SMap[word] === 0) {
                let falg = false
                for (let n in SMap) {
                    if (SMap[n] !== 0) falg = true
                }
                if (!falg) result.push(i)
            }
        }
    }
    return result
};

参考回答