leecode题解Golang版本:LCR 015. 找到字符串中所有字母异位词

前言

笔者在该专栏会展示golang的题解,该题解已经经过leecode的用例验证,期望能够给大家一些启发。

题目描述

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

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

题解

func findAnagrams(s string, p string) []int {
   
	m, valid := counter(p)
	res := make([]int, 0)
	for l, r := 0, 0; r < len(s); r++ {
   
		if v, ok := m[s[r]]; ok {
   
			m[s[r]]--
			if v == 1 {
   
				valid--
			}
		}
		for r-l > len(p)-1 {
   
			if v, ok := m[s[l]]; ok {
   
				m[s[l]]++
				if v == 0 {
   
					valid++
				}
			}
			l++
		}
		if valid == 0 {
   
			res = append(res, l)
		}

	}
	return res
}
func counter(p string) (map[uint8]int, int) {
   
	res := make(map[uint8]int)
	for i := 0; i < len(p); i++ {
   
		res[p[i]]++
	}
	return res, len(res)
}

核心细节一:巧用map和valid常量判断字符是否互为全排列

leecode-LCR 017. 最小覆盖子串(golang版本
笔者在该文章中阐述了该思路

核心细节二:滑动窗口的收缩时机

以s=abab,t=ab为例,我们来展示该滑动窗口的伸展和收缩逻辑。

区间范围 是否包含字符串t 滑动窗口大小是否与t相等
[0,0)
[0,1)
[0,2)

此刻我们可以看出滑动窗口内包含的字符串是ab,恰好与ab相同,我们记录一下当前滑动窗口左边界的刻度0,该值是我们需要的。此时滑动窗口的大小恰好为t的长度,现在我们就可以继续维持滑动窗口的大小,右边界拓展一个位置,左边界收缩一个位置,然后统计新的滑动窗口内的字符串是否符合需求。当右边界到达s字符串末端,此时整个s字符串中的所有与t相同长度的子字符串都已经遍历完毕了。

相关推荐

  1. 找到字符串所有字母LeetCode 438)

    2023-12-19 17:38:02       52 阅读
  2. LeetCode 438.找到字符串所有字母

    2023-12-19 17:38:02       39 阅读
  3. Leetcode 438. 找到字符串所有字母

    2023-12-19 17:38:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-19 17:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-19 17:38:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-19 17:38:02       82 阅读
  4. Python语言-面向对象

    2023-12-19 17:38:02       91 阅读

热门阅读

  1. PHP解决Safari浏览器下载文件文件名称乱码的问题

    2023-12-19 17:38:02       75 阅读
  2. Zabbix“专家坐诊”第220期问答汇总

    2023-12-19 17:38:02       59 阅读
  3. moment.js使用diff方法返回NaN

    2023-12-19 17:38:02       54 阅读
  4. 自定义折线图的颜色 Python

    2023-12-19 17:38:02       54 阅读
  5. MVC环境搭建

    2023-12-19 17:38:02       47 阅读
  6. 开源许可证保姆级入门手册

    2023-12-19 17:38:02       62 阅读