068_找到字符串中所有字母异位词
知识点:滑动窗口、数组
LeetCode第四百三十八题:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/submissions/
语言:GoLang
// 滑动窗口,仅仅是将map改成[26]int,时间就从44%变成100%,相差这么大的吗
func findAnagrams(s string, p string) []int {
sLen, pLen := len(s), len(p)
setLen := 0
sets := [26]int{}
for i := 0; i < pLen; i++ {
if sets[p[i] - 'a'] == 0 {
setLen++
}
sets[p[i] - 'a']++
}
result := []int{}
left, right, counter, window := 0, 0, 0, [26]int{}
for left < sLen - pLen + 1 {
rc := s[right] - 'a'
right++
// 跳过不必要的元素
if sets[rc] == 0 && counter > 0 {
left, counter, window = right, 0, [26]int{}
continue
}
window[rc]++
if window[rc] == sets[rc] {
counter++
}
for right - left >= pLen {
if counter == setLen {
result = append(result, left)
}
lc := s[left] - 'a'
left++
if window[lc] == sets[lc] {
counter--
}
window[lc]--
}
}
return result
}
// 滑动窗口,map版本
func findAnagrams_0(s string, p string) []int {
sLen, pLen := len(s), len(p)
sets := map[byte]int{}
for i := 0; i < pLen; i++ {
sets[p[i]]++
}
result := []int{}
left, right, counter, window := 0, 0, 0, map[byte]int{}
for right < sLen {
rc := s[right]
right++
if sets[rc] == 0 {
left, counter, window = right, 0, map[byte]int{}
continue
}
if sets[rc] > 0 {
window[rc]++
if window[rc] == sets[rc] {
counter++
}
}
for right - left >= pLen {
if counter == len(sets) {
result = append(result, left)
}
lc := s[left]
left++
if sets[lc] > 0 {
if window[lc] == sets[lc] {
counter--
}
window[lc]--
}
}
}
return result
}
// 朴素解法,O(m*n),m,n分别为s和p的长度
func findAnagrams_(s string, p string) []int {
sLen, pLen := len(s), len(p)
result := []int{}
for i := 0; i < sLen - pLen + 1; i++ {
if isSame(s[i : i + pLen], p) {
result = append(result, i)
}
}
return result
}
func isSame(s1, s2 string) bool {
length := len(s1)
container := [26]int{}
for i := 0; i < length; i++ {
container[s1[i] - 'a']++
container[s2[i] - 'a']--
}
for i := 0; i < 26; i++ {
if container[i] != 0 {
return false
}
}
return true
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端