题目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. 最小覆盖子串(滑动窗口解决子串问题系列)的更多相关文章

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

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

  2. *438. Find All Anagrams in a String 找到字符串中所有字母异位词

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

  3. [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 ...

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

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

  5. Leetcode438.Find All Anagrams in a String找到字符串中所有字母异位词

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

  6. leetcode刷题-49字母异位词分组

    题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 思路 由于异位词由相同字母构成,所以可以用一个顺序的字符串作为这些字母异位词的标志,由此可以想到字典的方法 ...

  7. LeetCode:反转字符串中的元音字母【345】

    LeetCode:反转字符串中的元音字母[345] 题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "h ...

  8. leetcode.字符串.242有效的字母异位词-Java

    1. 具体题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注:判断两个字符串包含的字母是否完全一样. 示例 1: 输入: s = "anagram&q ...

  9. LeetCode初级算法之字符串:242 有效的字母异位词

    有效的字母异位词 题目地址:https://leetcode-cn.com/problems/valid-anagram/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位 ...

随机推荐

  1. node.js 出现server instance pool was destroyed

    初步判断为MongodbClient断开连接的原因. 之所以断开连接,可能是多个操作间隔时间比较久. 解决方法之一,不要调用close方法.

  2. Java中同步的基本概念监视器–最简单粗暴的理解方法

    大学有一门课程叫操作系统,学习过的同学应该都记得,监视器是操作系统实现同步的重要基础概念,同样它也用在JAVA的线程同步中,这篇文章用一种类推的思想解释监视器"monitor". ...

  3. mycat数据库集群系列之mycat读写分离安装配置

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...

  4. SparkStreaming简单例子(oldAPI)

    SparkStreaming简单例子 ◆ 构建第一个Streaming程序: (wordCount) ◆ Spark Streaming 程序最好以使用Maven或者sbt编译出来的独立应用的形式运行 ...

  5. Spark on Yarn运行时加载的jar包

    spark on yarn运行时会加载的jar包有如下: spark-submit中指定的--jars $SPARK_HOME/jars下的jar包 yarn提供的jar包 spark-submit通 ...

  6. Go:grpc

    一.grpc安装 将 https://github.com/google/go-genproto 修改文件名放到 $GOPATH/src/google.golang.org/genproto 将 ht ...

  7. Mac 系统安装robot framework

    1.安装Python3 版本 2.安装robotframework:pip3 install robotframework 3.安装Pypubsub:pip3 install Pypubsub 4.安 ...

  8. openCV - 2. 矩阵的掩膜操作

    获取图像像素指针.掩膜操作解释 获取图像像素指针 CV_Assert(myImage.depth() == CV_8U); Mat.ptr<uchar>(int i=0) 获取像素矩阵的指 ...

  9. RPC的入门应用

    一.什么是RPC RPC 的全称是 Remote Procedure Call ,是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这 ...

  10. ORA-01455: converting column overflows integer datatypes.

    系统执行抛了一个ORA-01455: converting column overflows integer datatypes.把当时执行的SQL取出来,在plsql developer里面执行是没 ...