publicstaticintminSubArrayLen(int target, int[] nums) { intans= Integer.MAX_VALUE; for (intl=0, r = 0, sum = 0; r < nums.length; r++) { sum += nums[r]; while (sum - nums[l] >= target) { // sum : nums[l....r] // 如果l位置的数从窗口出去,还能继续达标,那就出去 sum -= nums[l++]; } if (sum >= target) { ans = Math.min(ans, r - l + 1); } } return ans == Integer.MAX_VALUE ? 0 : ans; }
无重复子串的最长长度
记录上次这个字符出现的位置,每次更新左边界,就用当前左边界跟(上次重复位置+1)的最大值即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
publicstaticintlengthOfLongestSubstring(String str) { char[] s = str.toCharArray(); intn= s.length; // char -> int -> 0 ~ 255 // 每一种字符上次出现的位置 int[] last = newint[256]; // 所有字符都没有上次出现的位置 Arrays.fill(last, -1); // 不含有重复字符的 最长子串 的长度 intans=0; for (intl=0, r = 0; r < n; r++) { l = Math.max(l, last[s[r]] + 1); ans = Math.max(ans, r - l + 1); // 更新当前字符上一次出现的位置 last[s[r]] = r; } return ans; }
最小覆盖子串
描述:给定两个字符串 s 和 t,长度分别是 m 和 n,返回 s 中的 最短窗口 子串,使得该子串包含 t 中的每一个字符(包括重复字符)。如果没有这样的子串,返回空字符串 “”。