滑动窗口
3. 无重复字符的最长子串

class Solution {
public int lengthOfLongestSubstring(String s) {
int res = 0;
int l = 0;
int r = 0;
Map<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
r++;
char temp = chars[i];
if (map.getOrDefault(temp, 0) > 0) {
for (int j = l; j < i; j++) {
if (chars[j] == temp) {
l++;
break;
} else {
l++;
map.put(chars[j], 0);
}
}
}
map.put(temp, 1);
res = Math.max(res, r - l);
}
return res;
}
}
76. 最小覆盖子串
粗略实现
class Solution {
Map<Character, Integer> targetMap = new HashMap<>();
Map<Character, Integer> map = new HashMap<>();
public String minWindow(String s, String t) {
boolean flag = false;
int start = 0;
int Len = s.length();
int left = 0;
int right = 0;
for (char c : t.toCharArray()) {
targetMap.put(c, targetMap.getOrDefault(c, 0) + 1);
}
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
right++;
char temp = chars[i];
if (targetMap.containsKey(temp)) {
map.put(temp, map.getOrDefault(temp, 0) + 1);
if (isFull()) {
flag = true;
for (int j = left; j <= i; j++) {
if (targetMap.containsKey(chars[j])) {
map.put(chars[j], map.get(chars[j]) - 1);
if (!isFull()) {
if (Len > right - left) {
Len = right - left;
start = left;
}
left++;
break;
}else {
left++;
}
}else {
left++;
}
}
}
}
}
if (flag) {
return s.substring(start, start + Len);
}
return "";
}
public boolean isFull(){
for (Character character : targetMap.keySet()) {
if (targetMap.get(character).compareTo(map.getOrDefault(character, -1)) > 0){
return false;
}
}
return true;
}
}
由于都是英文字母 ===> 使用数组进行优化
class Solution {
int[] targetMap = new int[128];
int[] map = new int[128];
public String minWindow(String s, String t) {
boolean flag = false;
int start = 0;
int Len = s.length();
int left = 0;
int right = 0;
for (char c : t.toCharArray()) {
targetMap[c]++;
}
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
right++;
char temp = chars[i];
if (targetMap[temp] != 0) {
map[temp]++;
if (isFull()) {
flag = true;
for (int j = left; j <= i; j++) {
if (targetMap[chars[j]] != 0) {
map[chars[j]]--;
if (!isFull()) {
if (Len > right - left) {
Len = right - left;
start = left;
}
left++;
break;
}else {
left++;
}
}else {
left++;
}
}
}
}
}
if (flag) {
return s.substring(start, start + Len);
}
return "";
}
public boolean isFull(){
for (int i = 0; i < 128; i++) {
if (map[i] < targetMap[i]){
return false;
}
}
return true;
}
}
变形题【关联子串】
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
int start = 0;
int Len = Integer.MAX_VALUE;
int[] targetMap = new int[128];
int[] map = new int[128];
Scanner in = new Scanner(System.in);
String[] split = in.nextLine().split(" ");
String target = split[0];
String str = split[1];
for (char c : target.toCharArray()) {
targetMap[c]++;
}
int res = -1;
int left = 0;
int right = 0;
for (int i = 0; i < str.length(); i++) {
right++;
char temp = str.charAt(i);
if (targetMap[temp] != 0) {
map[temp]++;
if (isFull(map, targetMap)) {
for (int j = left; j <= i; j++) {
char c = str.charAt(j);
if (targetMap[c] != 0) {
map[c]--;
if (!isFull(map, targetMap)) {
if (Len > right - left) {
Len = right - left;
start = left;
}
left++;
break;
}else {
left++;
}
} else {
left++;
}
}
}
}
}
if (Len != target.length()){
System.out.println(-1);
return;
}
System.out.println(start);
}
public static boolean isFull(int[] map, int[] targetMap){
for (int i = 0; i < 128; i++) {
if (map[i] < targetMap[i]){
return false;
}
}
return true;
}
}
438. 找到字符串中所有字母异位词
class Solution {
int[] now = new int[128];
int[] target = new int[128];
public List<Integer> findAnagrams(String s, String p) {
for (char c : p.toCharArray()) {
target[c-'a']++;
}
List<Integer> list = new ArrayList<>();
int l = 0;
int r = 0;
for (int i = 0; i < s.length(); i++) {
r++;
now[s.charAt(i) - 'a']++;
if (r - l < p.length()){
continue;
}
if (isSame()) {
list.add(l);
}
now[s.charAt(l) - 'a']--;
l++;
}
return list;
}
public boolean isSame(){
for (int i = 0; i < 128; i++) {
if (now[i] != target[i]){
return false;
}
}
return true;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix