//外层循环扩展右边界,内层循环扩展左边界 for (intl=0, r = 0 ; r < n ; r++) { //当前考虑的元素(一般是 right 指向的那个元素) while (l <= r && check()) {//区间[left,right]不符合题意 //扩展左边界 } //区间[left,right]符合题意,统计相关信息 }
利用 set 来判断是否包含重复字符,若窗口内有重复字符串,则 left 指针一直向后移动直到窗口内无重复字符串
classSolution { publicintlengthOfLongestSubstring(String s) { intans=0; HashSet<Character> set = newHashSet<>(); char[] str = s.toCharArray(); for (intleft=0, right = 0; right < s.length(); right++) { charch= str[right]; while (set.contains(ch)) { set.remove(str[left]); left++; } set.add(ch); ans = Math.max(ans, right - left + 1); } return ans; } }
找到字符串中所有字母异位词
力扣题目链接 给定两个字符串 s 和 p,找到 s 中所有 p 的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
定长滑动窗口,维护窗口内各字母的出现次数然后进行比对即可,比对结束后 left 往右移动 1 个位置(即 left 对应的字母出现次数减一)
left 恒等于 right - length + 1
classSolution { public List<Integer> findAnagrams(String s, String p) { List<Integer> ans = newArrayList<>(); int[] cntP = newint[26]; int[] cntS = newint[26]; for (char c : p.toCharArray()) { cntP[c - 'a']++;// 统计p的字母及次数 } for (intright=0; right < s.length(); right++) { cntS[s.charAt(right) - 'a']++; intleft= right - p.length() + 1; if (left < 0) { continue; } if (Arrays.equals(cntS, cntP)) { ans.add(left); } cntS[s.charAt(left) - 'a']--; } return ans; } }
最小覆盖子串
力扣题目链接 给你一个字符串 s、一个字符串 t。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”。
滑动窗口,枚举右侧边界,直到包含 t 中所有字符
随后移动左侧边界,寻找是否有更短的情形
判断是否包含,使用的是哈希数组
A ~ Z 是 65 ~ 90
a ~ z 是 97 ~ 122
int[a] 也就是int[97]
classSolution { public String minWindow(String S, String t) { char[] s = S.toCharArray(); intm= s.length; intansLeft= -1; intansRight= m; int[] cntS = newint[128]; int[] cntT = newint[128]; for (char c : t.toCharArray()) { cntT[c]++; } intleft=0; for (intright=0; right < s.length; right++) { cntS[s[right]]++; while (isCovered(cntS, cntT)) { if (right - left < ansRight - ansLeft) { ansLeft = left; ansRight = right; } cntS[s[left]]--; left++; } } return ansLeft < 0 ? "" : S.substring(ansLeft, ansRight + 1); } privatebooleanisCovered(int[] cntS, int[] cntT) { for (inti='A'; i <= 'Z'; i++) { if (cntS[i] < cntT[i]) { returnfalse; } } for (inti='a'; i <= 'z'; i++) { if (cntS[i] < cntT[i]) { returnfalse; } } returntrue; } }