1. 最小覆盖子串(困难)
地址: https://leetcode-cn.com/problems/minimum-window-substring/
2022/02/01
做题反思:
class Solution {
public String minWindow(String s, String t) {
if (t.length() > s.length()) {
return "";
}
HashMap<Character, Integer> need = new HashMap<>();
HashMap<Character, Integer> window = new HashMap<>();
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
need.put(c, need.getOrDefault(c, 0) + 1);
}
int l = 0, r = 0;
int valid = 0;
int start = 0, len = Integer.MAX_VALUE;
while (r < s.length()) {
char c = s.charAt(r);
r++;
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
while (valid == need.size()) {
if (r - l < len) {
start = l;
len = r - l;
}
char d = s.charAt(l);
l++;
if (need.containsKey(d)) {
if (window.get(d).equals(need.get(d))) {
valid--;
}
window.put(d, window.get(d) - 1);
}
}
}
return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
}
}
2. 字符串的排列(中等)
地址: https://leetcode-cn.com/problems/permutation-in-string/
2022/02/01
做题反思:
class Solution {
public boolean checkInclusion(String s1, String s2) {
if (s1.length() > s2.length()) {
return false;
}
HashMap<Character, Integer> need = new HashMap<>();
HashMap<Character, Integer> window = new HashMap<>();
for (int i = 0; i < s1.length(); i++) {
char c = s1.charAt(i);
need.put(c, need.getOrDefault(c, 0) + 1);
}
int l = 0, r = 0;
int valid = 0;
while (r < s2.length()) {
char c = s2.charAt(r);
r++;
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
while (r - l == s1.length()) {
if (valid == need.size()) {
return true;
}
char d = s2.charAt(l);
l++;
if (need.containsKey(d)) {
if (window.get(d).equals(need.get(d))) {
valid--;
}
window.put(d, window.get(d) - 1);
}
}
}
return false;
}
}
3. 找到字符串中所有字母异位词(中等)
地址: https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/
2022/02/01
做题反思:
class Solution {
public List<Integer> findAnagrams(String s, String p) {
HashMap<Character, Integer> need = new HashMap<>();
HashMap<Character, Integer> window = new HashMap<>();
List<Integer> res = new LinkedList<>();
for (int i = 0; i < p.length(); i++) {
char c = p.charAt(i);
need.put(c, need.getOrDefault(c, 0) + 1);
}
int l = 0, r = 0;
int valid = 0;
int start = 0;
while (r < s.length()) {
char c = s.charAt(r);
r++;
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
while (r - l == p.length()) {
if (valid == need.size()) {
res.add(l);
}
char d = s.charAt(l);
l++;
if (need.containsKey(d)) {
if (window.get(d).equals(need.get(d))) {
valid--;
}
window.put(d, window.getOrDefault(d, 0) - 1);
}
}
}
return res;
}
}
4. 无重复字符的最长子串(中等)
地址: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
2022/02/01
做题反思:
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> window = new HashMap<>();
int l = 0, r = 0;
int res = 0;
while (r < s.length()) {
char c = s.charAt(r);
r++;
window.put(c, window.getOrDefault(c, 0) + 1);
while (window.get(c) > 1) {
char d = s.charAt(l);
l++;
window.put(d, window.get(d) - 1);
}
res = Math.max(res, r - l);
}
return res;
}
}