leetcode 剑指 Offer II 015. 字符串中的所有变位词

140 阅读2分钟

[toc] leetcode 剑指 Offer II 015. 字符串中的所有变位词

题目描述

剑指 Offer II 015. 字符串中的所有变位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

变位词 指字母相同,但排列不同的字符串。

示例 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" 的变位词。

提示:

1 <= s.length, p.length <= 3 * 104 s 和 p 仅包含小写字母

解题思路

法1

滑窗:

  1. 遍历数组,取出长度为len(p)的子串

  2. 验证两个字符串(p与s的子串)是否为异构(字符的种类与数量相同),如果是,记录该位置,不是继续遍历

  3. 返回所有满足条件的位置数组

  • 时间复杂度(O(n))
  • 空间复杂度(O(n))

执行结果

法1

func findAnagrams(s string, p string) []int {
	result := []int{}
	if len(s) < len(p) {
		return result
	}

	pFreq := make([]int, 26)
	sFreq := make([]int, 26)

	for i := 0; i < len(p); i++ {
		pFreq[p[i]-'a']++
		sFreq[s[i]-'a']++
	}

	if isEqual(pFreq, sFreq) {
		result = append(result, 0)
	}

	for i := len(p); i < len(s); i++ {
		sFreq[s[i]-'a']++
		sFreq[s[i-len(p)]-'a']--

		if isEqual(pFreq, sFreq) {
			result = append(result, i-len(p)+1)
		}
	}

	return result
}

func isEqual(arr1, arr2 []int) bool {
	for i := 0; i < 26; i++ {
		if arr1[i] != arr2[i] {
			return false
		}
	}
	return true
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 8 ms , 在所有 Go 提交中击败了 51.16% 的用户 内存消耗: 4.8 MB , 在所有 Go 提交中击败了 68.99% 的用户 通过测试用例: 60 / 60 炫耀一下:

本文由mdnice多平台发布