[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 的字母异位 ...
随机推荐
- linux下免密登录配置
1.首先大家先开三台虚拟机 2.回到首层. 2.1:编辑文件: vim /etc/ssh/sshd_config 3:在master的linux上生成ssh密钥: ssh-keygen -t r ...
- Git操作之码云代码clone
安装Git https://git-scm.com/book/zh/v2/起步-安装-Git Git的网站上有详细的分各种系统的安装教程. 配置Git 1. 打开你要放置项目的本地路径,右键选择$ G ...
- 浅谈Docker(一)
注:由于别人写的太好了就转来基础介绍! 转自:http://www.infoq.com/cn/articles/docker-core-technology-preview Docker是PaaS供应 ...
- Linux用户和组密令大全
本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数. 1.建用户: adduser phpq passwd phpq ...
- 鼠标放上时显示隐藏的div或者其他代码的“jquery”的三种写法和“JavaScript”的一种写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- wc.exe程序
1.gitHub地址:https://github.com/loveYuJun/wc.exe.git 2.PSP表格 psp2.1 Personal Software Process Stages 预 ...
- SpringBoot使用简单缓存
第一步开启缓存(只要是springboot项目就可以) 数据库连接等相关配置请读者自行实现. 在Application启动类上添加注解 @EnableCaching 开启缓存 @SpringBoot ...
- Windows Server 2012 两台服务器文件同步
下载cwRsyncServer软件安装(这是Windows下的文件同步软件) 一.(1)在文件客户端服务器安装该软件,找到安装位置下的rsyncd.conf,修改配置文件(注意在Windows下输入位 ...
- 全局api 2020/8/14
// 注意:每次调用 $.get() 或 $.post() 或 $.ajax() 的时候, // 会先调用 ajaxPrefilter 这个函数 // 在这个函数中,可以拿到我们给Ajax提供的配置对 ...
- 力扣Leetcode 200. 岛屿数量
岛屿数量 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成. 此外,你可以假设该网 ...