欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > LeetCode 438. 找到字符串中所有字母的异位词

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

2025/4/4 1:41:33 来源:https://blog.csdn.net/Coffeemaker88/article/details/146786363  浏览:    关键词:LeetCode 438. 找到字符串中所有字母的异位词

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

在这里插入图片描述

题目描述

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

输入输出示例及数据范围

在这里插入图片描述

思路

这道题的思路其实很简单,就是一个滑动窗口的裸题,但是 LeetCode 官方题解当中给出的 Golang 解法非常适合学习,因此通过本篇文章进行记录。

具体来说,Golang 与 C++ 不同,Golang 的 slice 不能比较,因为 slice 是引用类型,而 C++ 的 vector 之间可以相互比较。但 Golang 的数组之间可以相等比较,前提是数组的类型完全相同【需要注意的是,数组的长度也是数组类型的一部分】。

解决这道题要使用数组来完成。具体来说,我们开两个长度为 26 的整型数组,用于存储子串中字符的个数。我们需要用 s 串的子串来匹配 p 串,如果 p 的长度在开始时就大于 s,那么答案为空。否则我们先记录 p 串的长度。题解当中同时统计 p 串和 s 串从 0 开始到 len(p) - 1 区间内的字符个数,如果二者匹配,则 0 是答案的一部分,代表从 0 开始的 s 子串与 p 匹配。

之后,官方题解用到了数组的切片,这一点我一开始确实没想到。在 for loop 中从 0 遍历到 len(s) - len(p) - 1,然后统计 i + 1i + len(p) + 1 这个区间内 s 子串的字符个数。统计完成后,再与 p 串比较,如果两个数组相等,则模式匹配成功,记录 i + 1 作为答案的一部分即可。

Golang 代码

func findAnagrams(s string, p string) []int {ans := []int{}if len(s) < len(p) {return ans}ms, mp := [26]int{}, [26]int{}for i, ch := range(p) {ms[s[i] - 'a'] ++mp[ch - 'a'] ++}if ms == mp {ans = append(ans, 0)}for i, ch := range(s[:len(s) - len(p)]) {ms[ch - 'a'] --ms[s[i + len(p)] - 'a'] ++if ms == mp {ans = append(ans, i + 1)}}return ans
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词