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

  • 438. 找到字符串中所有字母异位词
  • 题解
  • 官方

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

难度 中等
给定两个字符串 sp,找到 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 仅包含小写字母

题解

思路:暴力
把p的全排列找出(可行性不高)
判断s里面是否包含或者类比:模式匹配
把p按字母升序排列得到新的p
把每次匹配的结果按字母升序排列和新的p比较,
比较可以通过异或运算或者把所求的p中的字母转化成一种唯一的数字(ACII码)
把所求的p转化成这些数字进行某种运算得到的唯一的结果(异或)

代码

发现不太好搞,直接看官方解答吧
并且异或不一定保证结果的唯一性

官方

方法一:滑动窗口
思路

根据题目要求,我们需要在字符串 s 寻找字符串 p 的异位词。因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。

算法

在算法的实现中,我们可以使用数组来存储字符串 p 和滑动窗口中每种字母的数量。

细节

当字符串 s 的长度小于字符串 p 的长度时,字符串 s 中一定不存在字符串 p 的异位词。但是因为字符串 s 中无法构造长度与字符串 p 的长度相同的窗口,所以这种情况需要单独处理。

代码

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/solution/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen = s.length(), pLen = p.length();if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans = new ArrayList<Integer>();int[] sCount = new int[26];int[] pCount = new int[26];for (int i = 0; i < pLen; ++i) {++sCount[s.charAt(i) - 'a'];++pCount[p.charAt(i) - 'a'];}if (Arrays.equals(sCount, pCount)) {ans.add(0);}for (int i = 0; i < sLen - pLen; ++i) {--sCount[s.charAt(i) - 'a'];++sCount[s.charAt(i + pLen) - 'a'];if (Arrays.equals(sCount, pCount)) {ans.add(i + 1);}}return ans;}
}

解读

用一下语句进行对s和p的转换,for (int i = 0; i < pLen; ++i) {++sCount[s.charAt(i) - 'a'];++pCount[p.charAt(i) - 'a'];}把s和p都转为两个个计数器数组sCount和pCount[问题就转化为在sCount寻找pCountfor (int i = 0; i < sLen - pLen; ++i) {--sCount[s.charAt(i) - 'a'];++sCount[s.charAt(i + pLen) - 'a'];if (Arrays.equals(sCount, pCount)) {ans.add(i + 1);}}上面就是窗口滑动,每一次只滑动一位,然后比较

438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】相关推荐

  1. 【LeetCode】【HOT】438. 找到字符串中所有字母异位词(滑动窗口)

    [LeetCode][HOT]438. 找到字符串中所有字母异位词 文章目录 [LeetCode][HOT]438. 找到字符串中所有字母异位词 package hot;import java.uti ...

  2. 438. 找到字符串中所有字母异位词【异位词-哈希数组】

    438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括 ...

  3. Java实现 LeetCode 438 找到字符串中所有字母异位词

    438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p ...

  4. LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)

    1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...

  5. LeetCode 438. 找到字符串中所有字母异位词(双指针+滑动窗口)

    题目描述 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. ...

  6. leetcode刷题(91)——438. 找到字符串中所有字母异位词

    给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...

  7. 【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列

    今天是坚持每日一题打卡的第二十七天 题目链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/ 题解汇总:https:// ...

  8. LeetCode:438. 找到字符串中所有字母异位词(简单易懂)

    一.题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括相同的字符串). 示例 ...

  9. leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)

    题目 https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题解 方法1:尝试构造一种"与顺序无关的哈希" 思考 ...

最新文章

  1. 【BZOJ】1299: [LLH邀请赛]巧克力棒
  2. 在这个问题上,能看出 Java 工程师的真实水平
  3. 第四届中国国际大数据大会务实推进应用落地
  4. spring cloud config配置中心源码分析之注解@EnableConfigServer
  5. (xy)+((x^y)1)
  6. ElemenUi搜索数据时如何重置输入框的内容
  7. 加你用移动端数据爬取
  8. python中with的用法_python 中 with的用法
  9. tensorflow图形识别_手把手教你使用TF服务将TensorFlow模型部署到生产环境
  10. Springsecurity之UserDetails
  11. log4net异步写入日志_redis学习笔记(三)RDB日志
  12. C# action 返回值_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别
  13. 关于发送H264 sdp里的
  14. 【雷达通信】基于matlab GUI雷达脉冲压缩【含Matlab源码 303期】
  15. 数据库中制作一个拼音缩写查询函数
  16. 51单片机最小系统解读
  17. 【盒子居中常用的四种方法】
  18. SQL Server在本地计算机上用SMSS登录不上,错误消息:(Microsoft SQL Server, Error: 18456)...
  19. saveOrUpdate
  20. C:深入研究MessageBox

热门文章

  1. elm_flask 项目日志 -- flask后台管理系统开发设计
  2. 分布式可扩展数据库架构
  3. axure 8 表格合并_Python办公自动化(六)|自动更新表格,告别繁琐
  4. JAVA的那个蜥蜴是什么_你知道爬行脑是什么脑吗?
  5. softmax与logistic关系
  6. 转:上午还在写Bug,下午突然“被离职”,咋整?
  7. C语言标准库函数qsort(快速排序函数)
  8. python输入一个假分数_苏教版五下数学四分数的意义和性质第5课时假分数化成整数或带分数教案...
  9. 【MATLAB】直方图均衡化Matlab实现(非histeq内置函数)
  10. 计算机 字节、位等之间的换算