classSolution{ publicintlengthOfLongestSubstring(String s){ if (s.length() == 0) { return0; } Map<Character, Integer> map = new HashMap<>(); int left = 0, max = 0; for (int i = 0; i < s.length(); i++) { if (map.containsKey(s.charAt(i))) { //从重复的字符的下一个字符重新开始 left = Math.max(left, map.get(s.charAt(i)) + 1); } map.put(s.charAt(i), i); max = Math.max(max, i - left + 1); } return max; } }
classSolution{ public List<Integer> findAnagrams(String s, String p){ List<Integer> ans = new ArrayList<>(); //数组统计各个字母的数量 int[] num = newint[26]; for (int i = 0; i < p.length(); i++) { num[p.charAt(i) - 'a']++; } //滑动窗口左指针 int l = 0; for (int r = 0; r < s.length(); r++) { //更新当前窗口内的字符数量 num[s.charAt(r) - 'a']--; //当有p中不存在的字母或者是重复的字母出现就会进入循环 //滑动窗口左指针向右移动,若遇见重复的字符 l = r ;若是遇见p中不存在的字符,r比l大1,这样刚好可以过掉那个p中不存在的字符 while (num[s.charAt(r) - 'a'] < 0) { num[s.charAt(l) - 'a']++; //恢复计数的数组 l++; } if (r - l + 1 == p.length()) { ans.add(l); } } return ans; } }
classSolution{ publicintsubarraySum(int[] nums, int k){ int ans = 0, pre = 0; Map<Integer, Integer> map = new HashMap<>(); map.put(0, 1); for (int i = 0; i < nums.length; i++) { pre += nums[i]; if (map.containsKey(pre - k)) { ans += map.get(pre - k); } map.put(pre, map.getOrDefault(pre, 0) + 1); } return ans; } }