[LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)
题目438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
题解
滑动窗口。
数据结构
准备两个HashMap,needs存模式串中各字符出现次数,window存待匹配串中(在needs中出现过的)各字符出现的次数。
用match来计数量匹配对的字符数。
具体方法
- 维护滑动窗口的左右指针。
- 右指针不断右移知道串包含了所有模式串中出现的字符,且出现次数大于等于其。
- 然后在满足“包含了所有模式串中出现的字符,且出现次数大于等于其”的条件下,不断右移左指针,每次若长度等于模式串则找到一个所求串,每次右移左指针也要相应更新window和match。
- 总体直到右指针到字符串结尾后结束,时间复杂度O(n).
相关
对象的相等比较要用obj1.equals(obj2)
,而不能用==
,==
比较的是对象地址。
代码
class Solution {
public List<Integer> findAnagrams(String s, String p) {
if(s==null||p==null){
return null;
}
List<Integer> ansList=new ArrayList<Integer>();
HashMap<Character,Integer> needs=new HashMap<>();
HashMap<Character,Integer> window=new HashMap<>();
for(int i=0;i<p.length();++i){
needs.put(p.charAt(i),needs.getOrDefault(p.charAt(i),0)+1);
}
int l=0;
int r=0;
int matchCnt=0;
int hopMatchCharCnt=needs.size();//
while(r<s.length()){
char c=s.charAt(r);
if(needs.containsKey(c)){
window.put(c,window.getOrDefault(c,0)+1);
if(window.get(c).equals(needs.get(c))){
++matchCnt;
}
}
while(matchCnt==hopMatchCharCnt){//
if(r-l+1==p.length()){//
ansList.add(l);
}
//包含子串情况下l不断右移
char leftC=s.charAt(l);//
if(window.containsKey(leftC)){
window.put(leftC,window.get(leftC)-1);//
if(window.get(leftC)<needs.get(leftC)){
--matchCnt;
}
}
++l;
}
++r;
}
return ansList;
}
}
题目76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
题解
和上面基本一模一样==,改个返回即可。
代码
class Solution {
public String minWindow(String s, String t) {
if(s==null||t==null){
return "";
}
HashMap<Character,Integer> needs=new HashMap<>();
HashMap<Character,Integer> window=new HashMap<>();
for(int i=0;i<t.length();++i){
needs.put(t.charAt(i),needs.getOrDefault(t.charAt(i),0)+1);
}
int l=0;
int r=0;
int matchCnt=0;
int hopMatchCharCnt=needs.size();//
int minLen=Integer.MAX_VALUE;
int ansBeg=0;
while(r<s.length()){
char c=s.charAt(r);
if(needs.containsKey(c)){
window.put(c,window.getOrDefault(c,0)+1);
if(window.get(c).equals(needs.get(c))){
++matchCnt;
}
}
while(matchCnt==hopMatchCharCnt){//
if(r-l+1<minLen){//
ansBeg=l;
minLen=r-l+1;
}
//包含子串情况下l不断右移
char leftC=s.charAt(l);//
if(window.containsKey(leftC)){
window.put(leftC,window.get(leftC)-1);//
if(window.get(leftC)<needs.get(leftC)){
--matchCnt;
}
}
++l;
}
++r;
}
return minLen==Integer.MAX_VALUE?"":s.substring(ansBeg,ansBeg+minLen);
}
}
[LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)的更多相关文章
- Java实现 LeetCode 438 找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p ...
- *438. Find All Anagrams in a String 找到字符串中所有字母异位词
1. 原始题目 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 201 ...
- [Swift]LeetCode438. 找到字符串中所有字母异位词 | Find All Anagrams in a String
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
- Q438 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- Leetcode438.Find All Anagrams in a String找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- leetcode刷题-49字母异位词分组
题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 思路 由于异位词由相同字母构成,所以可以用一个顺序的字符串作为这些字母异位词的标志,由此可以想到字典的方法 ...
- LeetCode:反转字符串中的元音字母【345】
LeetCode:反转字符串中的元音字母[345] 题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "h ...
- leetcode.字符串.242有效的字母异位词-Java
1. 具体题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注:判断两个字符串包含的字母是否完全一样. 示例 1: 输入: s = "anagram&q ...
- LeetCode初级算法之字符串:242 有效的字母异位词
有效的字母异位词 题目地址:https://leetcode-cn.com/problems/valid-anagram/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位 ...
随机推荐
- 在eclipse中搜索 datasource.xml 文件:
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 简单的分库分表设计
前言 项目涉及到了一些设计模式,如果你看的不是很明白,没有关系坚持下来,写完之后去思考去品,你就会有一种突拨开云雾的感觉,所以请不要在半途感觉自己看不懂选择放弃,如果我哪里写的详细,或者需要修正请联系 ...
- unity探索者之UGUI图片描边
版权声明:本文为原创文章,转载请声明https://www.cnblogs.com/unityExplorer/p/13524270.html 自从UGUI出现之后,我就已经放弃使用NGUI了,原因不 ...
- PhpStorm安装及破解流程
下载完以后,把破解的jar包放到bin目录下,更改两个.vmoptions文件 我是安装了一个破解的和汉化包 jet是破解包,resource是汉化包,然后还要修改本地主机地址 例: 0.0.0.0 ...
- springboot + mybatisPlus 入门实例 入门demo
springboot + mybatisPlus 入门实例 入门demo 使用mybatisPlus的优势 集成mybatisplus后,简单的CRUD就不用写了,如果没有特别的sql,就可以不用ma ...
- SpringBoot整合WebSocket实现前后端互推消息
小编写这篇文章是为了记录实现WebSocket的过程,受不了啰嗦的同学可以直接看代码. 前段时间做项目时设计了一个广播的场景,具体业务不再赘述,最终要实现的效果就是平台接收到的信息实时发布给所有的用户 ...
- CentOS7升级系统内核至4.4.xx版本
CentOS7.x系统自带的3.10.x内核存在一些Bugs,导致运行的Docker.kubernetes不稳定,建议升级内核,容器使用的坑会少很多 下载内核源 rpm -Uvh http://www ...
- 第二篇 Scrum冲刺博客
一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 搜索框,首页轮播图,分类导航 商品列表,商品详情轮播图 陈泽佳 背景展示,选择并显示图片 历史足迹,静态页面 徐伟浩 登录权限获取 商品信 ...
- 力扣Leetcode 98. 验证二叉搜索树
验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身 ...
- python编写汉诺塔 Hanoi
#hanoi.py count = 0 def hanoi(n, src, dst, mid): #src为原1号柱子 dst 目标3号柱子 mid中间2号过渡柱子 global count #对全局 ...