3. 无重复字符的最长子串

image.png

暴力解法

将字符串的每个字符作为起点计算不重复的子串长度,最大值为答案

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. Set<Character> set = new HashSet<>();
  4. int max = 0;
  5. for (int i = 0; i < s.length(); i++) {
  6. for (int j = i; j < s.length() && !set.contains(s.charAt(j)); j++) {
  7. set.add(s.charAt(j));
  8. max = Math.max(max, set.size());
  9. }
  10. set.clear();
  11. }
  12. return max;
  13. }
  14. }

滑动窗口

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. Map<Character, Integer> map = new HashMap<>();
  4. int left = 0;
  5. int max = 0;
  6. for (int i = 0; i < s.length(); i++) {
  7. char c = s.charAt(i);
  8. // 注意要用 Math.max 函数,解决 map.get(c)+1 比 left 小导致结果出错的情况
  9. if (map.containsKey(c)) {
  10. left = Math.max(left, map.get(c) + 1);
  11. }
  12. map.put(c, i);
  13. max = Math.max(i - left + 1, max);
  14. }
  15. return max;
  16. }
  17. }