当前位置: 首页 > news >正文

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
}

相关文章:

  • 9、tlm 事务交互通信
  • 【11408学习记录】破译语言密码·征服数学迷宫——长难句拆解与方程不等式全析
  • RK3588使用笔记:系统算法依赖库安装
  • Linux信号——信号的产生(1)
  • 自然语言处理(18:(第五章3.)LSTM的实现)
  • 【算法1-5】贪心
  • 一文详解VS2022配置LibTorch环境:Windows平台LibTorch CUDA与cuDNN开发环境配置
  • marked库(高效将 Markdown 转换为 HTML 的利器)
  • 算法训练营第二十九天 | 动态规划(二)
  • TS 中 keyof 和 in 关键字详解
  • 使用Vscode的Remote-SSH通过ssh密钥免输入密码连接远程服务器
  • Java NIO之FileChannel 详解
  • unity客户端面试高频2(自用未完持续更新)
  • Androidstudio开发,实现商品分类
  • mysql 八股
  • android开启Sys V IPC,并使用共享内存编程
  • 流影---开源网络流量分析平台(二)(功能部署--流量探针)
  • C++ 中遍历 std::map
  • 网络基础概念
  • vue在template块里使用v-for循环对象、数组及嵌套结构数据
  • 建设一个网站平台的费用/网页广告调词平台多少钱
  • 郑州市人民政府网站建设现状/软文发布推广平台
  • 网站视频背景怎么做/知名的seo快速排名多少钱
  • 网站超链接怎么做/开发网站用什么软件
  • 一个虚拟空间做两个网站/武汉seo论坛
  • 静态网站源码下载/bt磁力搜索引擎索引