【算法】Leetcode438. 找到字符串中所有字母异位词(每日一题)
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. 找到字符串中所有字母异位词(每日一题)相关推荐
- Leetcode--438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- LeetCode-438. 找到字符串中所有字母异位词
题目描述: 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...
- 438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】
438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 题解 官方 438. 找到字符串中所有字母异位词 难度 中等 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 ...
- 【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 ...
- iOS LeetCode ☞ 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引.不考虑答案输出的顺序. 异位词 指由相同字母重排列形成的字符串(包括相同的字符串). 示例 1: 输入: ...
- mfc 找到字符串中字符_利用滑动窗口解LeetCode438题:找到字符串中所有字母异位词...
题目描述(难度中等) 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 ...
- 找到字符串中所有字母异位词—leetcode438
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- LeetCode 438. 找到字符串中所有字母异位词(滑动窗口)
1. 题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100 ...
最新文章
- 北大博士网恋被骗7400RMB,聊天记录惨遭曝光!
- golang 并发与并行学习笔记(一)
- 在Chrome 中调试Javascript
- BLE-NRF51822教程11-手机动态修改设备名
- Nginx 负载均衡4种模式
- 百度地图的两套JavaScript API
- detectandcompute 图像尺寸太大_基于深度局部特征的图像检索
- python新手入门课_Python基础视频12集入门课程
- CSS 制作手风琴导航
- 网页设计图片向上浮动_HTML5 背景图片漂浮/浮动特效
- 解除劳动关系后,职工医保怎么续缴?
- 成都大数据等新经济代表行业在全国城市位居前列
- Gdiplus的使用 gdi+
- 揭秘直播带货的收割套路
- 尜尜送的诗,以及我回的句
- 下列属于计算机应用,计算机的应用领域可大致分为6个方面,下列选项中属于计算机应用领域的是...
- 从数据库取String的值存放到Map中 按汉字首字母排序并输出
- LeetCode:Kth Smallest Element in a BST
- CSP 2022 提高组普及组总结
- [NLP学习笔记-Task10] Transformer + BERT
热门文章
- 实验三 高速公路收费站双收费口仿真
- SAP 财务月结之 外币评估(TCODE:FAGL_FC_VAL,S4版本用 FAGL_FCV)<转载>
- 闪耀DTCC | 腾讯云——提供全球领先的专业云计算服务
- 主流手机CPU及机型介绍!手机CPU生产厂商介绍!高通QSD8250、MSM8255、TI OMAP 3630、nVIDIA Tegra 2介绍
- 提高团队协作效率就靠它们了!
- linux英文论文范例,Argument essay官方主题范文三十六篇-经典英文议论文范例
- 技术创新是场寂寞的长跑
- IDEA搭建Go语言开发环境
- C/S模型与P2P模型
- 雅虎微软交易局中局:巴茨开始绝望主妇式攻击