[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
滑窗:
-
遍历数组,取出长度为len(p)的子串
-
验证两个字符串(p与s的子串)是否为异构(字符的种类与数量相同),如果是,记录该位置,不是继续遍历
-
返回所有满足条件的位置数组
- 时间复杂度(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多平台发布