438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】
438. 找到字符串中所有字母异位词
- 438. 找到字符串中所有字母异位词
- 题解
- 官方
438. 找到字符串中所有字母异位词
难度 中等
给定两个字符串 s
和 p
,找到 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. 找到字符串中所有字母异位词【我亦无他唯手熟尔】相关推荐
- 【LeetCode】【HOT】438. 找到字符串中所有字母异位词(滑动窗口)
[LeetCode][HOT]438. 找到字符串中所有字母异位词 文章目录 [LeetCode][HOT]438. 找到字符串中所有字母异位词 package hot;import java.uti ...
- 438. 找到字符串中所有字母异位词【异位词-哈希数组】
438. 找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括 ...
- Java实现 LeetCode 438 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p ...
- LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)
1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...
- LeetCode 438. 找到字符串中所有字母异位词(双指针+滑动窗口)
题目描述 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. ...
- leetcode刷题(91)——438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- 【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列
今天是坚持每日一题打卡的第二十七天 题目链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/ 题解汇总:https:// ...
- LeetCode:438. 找到字符串中所有字母异位词(简单易懂)
一.题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括相同的字符串). 示例 ...
- leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)
题目 https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题解 方法1:尝试构造一种"与顺序无关的哈希" 思考 ...
最新文章
- 【BZOJ】1299: [LLH邀请赛]巧克力棒
- 在这个问题上,能看出 Java 工程师的真实水平
- 第四届中国国际大数据大会务实推进应用落地
- spring cloud config配置中心源码分析之注解@EnableConfigServer
- (xy)+((x^y)1)
- ElemenUi搜索数据时如何重置输入框的内容
- 加你用移动端数据爬取
- python中with的用法_python 中 with的用法
- tensorflow图形识别_手把手教你使用TF服务将TensorFlow模型部署到生产环境
- Springsecurity之UserDetails
- log4net异步写入日志_redis学习笔记(三)RDB日志
- C# action 返回值_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别
- 关于发送H264 sdp里的
- 【雷达通信】基于matlab GUI雷达脉冲压缩【含Matlab源码 303期】
- 数据库中制作一个拼音缩写查询函数
- 51单片机最小系统解读
- 【盒子居中常用的四种方法】
- SQL Server在本地计算机上用SMSS登录不上,错误消息:(Microsoft SQL Server, Error: 18456)...
- saveOrUpdate
- C:深入研究MessageBox
热门文章
- elm_flask 项目日志 -- flask后台管理系统开发设计
- 分布式可扩展数据库架构
- axure 8 表格合并_Python办公自动化(六)|自动更新表格,告别繁琐
- JAVA的那个蜥蜴是什么_你知道爬行脑是什么脑吗?
- softmax与logistic关系
- 转:上午还在写Bug,下午突然“被离职”,咋整?
- C语言标准库函数qsort(快速排序函数)
- python输入一个假分数_苏教版五下数学四分数的意义和性质第5课时假分数化成整数或带分数教案...
- 【MATLAB】直方图均衡化Matlab实现(非histeq内置函数)
- 计算机 字节、位等之间的换算