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

难度中等702收藏分享切换为英文接收动态反馈

给定两个字符串 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" 的异位词

解题思路:

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

这是我第一次的解法:将字符串p的字母转为数字,与字符串s中的字串进行比较

public class LC0438 {public static List<Integer> findAnagrams(String s, String p) {List<Integer> list=new ArrayList<>();if(p.length()>s.length())return list;int count=0;for(int i=0;i<p.length();i++){count+=p.charAt(i)-96;}for(int i=0;i<s.length();i++){//当字符串s的剩余长度小于字符串p返回listif(s.length()-i<p.length())return list;int num=0;for(int j=i;j<i+p.length();j++){num+=s.charAt(j)-96;//当num大于count时直接breakif(num>count)break;}//当num等于count则是异位词if(num==count){list.add(i);}}return list;}public static void main(String[] args) {Scanner sc=new Scanner(System.in);String s=sc.nextLine();String p=sc.nextLine();System.out.println(findAnagrams(s,p));}
}

但是用例是af,be时通过不了,我又加了一些判断,但是当字符串非常长的时候也会出现问题

这是我第二次的解法:用数组中对应的各字母出现次数进行比较

  public List<Integer> findAnagrams(String s, String p) {int sLen=s.length();int pLen=p.length();List<Integer> list=new ArrayList<>();if(sLen<pLen)return list;int[] pCount=new int[26];int dff=0;for(char c:p.toCharArray()){pCount[c-'a']+=1;}for(int i=0;i<s.length();i++){if(s.length()-i<p.length())return list;if(!p.contains(s.substring(i,i+1)))continue;int[] sCount=new int[26];for(int j=i;j<i+p.length();j++){if(++sCount[s.charAt(j)-'a']>pCount[s.charAt(j)-'a']){break;}}if(Arrays.equals(pCount,sCount))list.add(i);}return list;}

我总共提交了三次,每次都加上了一些提前结束的判断,其中一些细节:

1.当s字符串剩余长度不足时返回list

2.当前增加的数组中值超过数组P中对应的值结束当前循环

平常写算法要多想不同方法,拓宽自己思路。竞赛或面试时才不容易思想掉线

同时多扣细节,竞赛时复杂度过高过不了的地方稍加优化可能就通过了,同时细节也是面试题算法的加分点

【算法】Leetcode438. 找到字符串中所有字母异位词(每日一题)相关推荐

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

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

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

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

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

    438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 题解 官方 438. 找到字符串中所有字母异位词 难度 中等 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 ...

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

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

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

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

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

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

  7. iOS LeetCode ☞ 找到字符串中所有字母异位词

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

  8. mfc 找到字符串中字符_利用滑动窗口解LeetCode438题:找到字符串中所有字母异位词...

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

  9. 找到字符串中所有字母异位词—leetcode438

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

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

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

最新文章

  1. 北大博士网恋被骗7400RMB,聊天记录惨遭曝光!
  2. golang 并发与并行学习笔记(一)
  3. 在Chrome 中调试Javascript
  4. BLE-NRF51822教程11-手机动态修改设备名
  5. Nginx 负载均衡4种模式
  6. 百度地图的两套JavaScript API
  7. detectandcompute 图像尺寸太大_基于深度局部特征的图像检索
  8. python新手入门课_Python基础视频12集入门课程
  9. CSS 制作手风琴导航
  10. 网页设计图片向上浮动_HTML5 背景图片漂浮/浮动特效
  11. 解除劳动关系后,职工医保怎么续缴?
  12. 成都大数据等新经济代表行业在全国城市位居前列
  13. Gdiplus的使用 gdi+
  14. 揭秘直播带货的收割套路
  15. 尜尜送的诗,以及我回的句
  16. 下列属于计算机应用,计算机的应用领域可大致分为6个方面,下列选项中属于计算机应用领域的是...
  17. 从数据库取String的值存放到Map中 按汉字首字母排序并输出
  18. LeetCode:Kth Smallest Element in a BST
  19. CSP 2022 提高组普及组总结
  20. [NLP学习笔记-Task10] Transformer + BERT

热门文章

  1. 实验三 高速公路收费站双收费口仿真
  2. SAP 财务月结之 外币评估(TCODE:FAGL_FC_VAL,S4版本用 FAGL_FCV)<转载>
  3. 闪耀DTCC | 腾讯云——提供全球领先的专业云计算服务
  4. 主流手机CPU及机型介绍!手机CPU生产厂商介绍!高通QSD8250、MSM8255、TI OMAP 3630、nVIDIA Tegra 2介绍
  5. 提高团队协作效率就靠它们了!
  6. linux英文论文范例,Argument essay官方主题范文三十六篇-经典英文议论文范例
  7. 技术创新是场寂寞的长跑
  8. IDEA搭建Go语言开发环境
  9. C/S模型与P2P模型
  10. 雅虎微软交易局中局:巴茨开始绝望主妇式攻击