Java 最长无重复子串算法解析:代码逐行分析

本文将对以下代码进行逐行分析,帮助您理解 Java 中求解最长无重复子串的算法原理和实现细节。

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        
        HashMap<Character, Integer> map = new HashMap<>();
        int maxLen = 0;
        int left = 0;
        
        for (int right = 0; right < s.length(); right++) {
            char c = s.charAt(right);
            
            if (map.containsKey(c)) {
                left = Math.max(left, map.get(c) + 1);
            }
            
            map.put(c, right);
            maxLen = Math.max(maxLen, right - left + 1);
        }
        
        return maxLen;
    }
}

代码逐行分析

  1. 创建一个名为 Solution 的类。
  2. 在类中定义一个名为 lengthOfLongestSubstring 的方法,该方法返回一个整数类型的值,并以一个字符串 s 作为参数。
  3. 在方法中,首先进行条件判断,如果 s 为 null 或者 s 的长度为 0,则返回 0。 这意味着如果输入字符串为空或不存在,则最长无重复子串的长度为 0。
  4. 创建一个 HashMap 对象 map,用于存储字符和其出现的索引位置。 我们使用 HashMap 来记录每个字符最后一次出现的位置,以便在遍历字符串时快速判断是否出现重复。
  5. 创建一个整数变量 maxLen,用于存储最长子串的长度,初始化为 0。 maxLen 用于记录当前遍历过程中发现的最长无重复子串的长度。
  6. 创建一个整数变量 left,用于存储子串的左边界,初始化为 0。 left 用于记录当前无重复子串的起始位置。
  7. 使用一个 for 循环遍历字符串 s 中的每个字符,循环变量为 right。 right 指向当前正在处理的字符。
  8. 在循环中,通过 s.charAt(right) 获取当前字符,并将其赋值给变量 c。 获取当前正在处理的字符。
  9. 使用 if 语句判断 map 中是否包含字符 c,即判断当前字符是否已经出现过。 如果字符 c 已经在 map 中出现过,说明当前子串中存在重复字符。
  10. 如果字符 c 已经在 map 中出现过,执行 if 语句块中的代码。
  11. 在 if 语句块中,使用 Math.max 方法比较 left 和 map.get(c) + 1 的值,将较大的值赋给 left。 这是为了确保 left 不会回退到已经出现过的字符的位置之前。 如果当前字符 c 之前出现过,我们将 left 更新为该字符之前出现位置的下一个位置,以确保当前子串不会包含重复字符。
  12. 将字符 c 和当前索引位置 right 存入 map 中。 更新字符 c 在字符串中的最新出现位置。
  13. 使用 Math.max 方法比较 maxLen 和 right - left + 1 的值,将较大的值赋给 maxLen。 这是为了更新最长子串的长度。 计算当前子串的长度,并与当前最长子串长度进行比较,更新最长子串长度。
  14. 循环结束后,返回 maxLen 作为结果。 返回最长无重复子串的长度。

总结

该算法的核心思想是使用滑动窗口,通过遍历字符串,并使用 HashMap 记录字符出现的最新位置,来判断当前子串是否包含重复字符,并更新最长无重复子串的长度。

希望本文的代码逐行分析能帮助您更好地理解 Java 最长无重复子串算法的实现原理。

Java 最长无重复子串算法解析:代码逐行分析

原文地址: https://www.cveoy.top/t/topic/qmgh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录