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

2021-11-28  本文已影响0人  MrLiuYS

<div class="image-package"><img src="https://img.haomeiwen.com/i1648392/3f82ebbee8d591b7.jpg" img-data="{"format":"jpeg","size":186659,"height":900,"width":1600}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><blockquote><p>给定两个字符串 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 仅包含小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。</p></blockquote><h1 id="mm1nr">题解</h1><div class="image-package"><img src="https://img.haomeiwen.com/i1648392/c07b4e186b5adf57.jpg" img-data="{"format":"jpeg","size":26786,"height":302,"width":1082}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h2 id="00z1i">Swift</h2><blockquote><p>class Solution {
func findAnagrams(_ s: String, _ p: String) -> [Int] {
// 1 s为空直接返回
guard s.count > 0 else { return [] }

let sArr = Array(s)

var neets = Character: Int

for char in p {
neets[char, default: 0] += 1
}
// 窗口
var window = Character: Int

var left = 0

var result = Int

for (index, char) in s.enumerated() {
window[char, default: 0] += 1

let windowSize = index - left + 1

// 保持窗口大小
if windowSize >= p.count {
let value = sArr[left]

if isSame(a: neets, b: window) {
result.append(left)
}

if let count = window[value], count > 1 {
window[value] = window[value]! - 1
} else {
window.removeValue(forKey: value)
}

left += 1
}
}

return result
}

func isSame(a: [Character: Int], b: [Character: Int]) -> Bool {
for element in a {
if b[element.key] != element.value {
return false
}
}
return true
}
}

print(Solution().findAnagrams("cbaebabacd", "abc"))
print(Solution().findAnagrams("abab", "ab"))
</p></blockquote><p>
</p><p>
</p><p>
</p><p>
</p>

上一篇 下一篇

猜你喜欢

热点阅读