Java 最长无重复子串算法解析:代码逐行分析
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;
}
}
代码逐行分析
- 创建一个名为 Solution 的类。
- 在类中定义一个名为 lengthOfLongestSubstring 的方法,该方法返回一个整数类型的值,并以一个字符串 s 作为参数。
- 在方法中,首先进行条件判断,如果 s 为 null 或者 s 的长度为 0,则返回 0。 这意味着如果输入字符串为空或不存在,则最长无重复子串的长度为 0。
- 创建一个 HashMap 对象 map,用于存储字符和其出现的索引位置。 我们使用 HashMap 来记录每个字符最后一次出现的位置,以便在遍历字符串时快速判断是否出现重复。
- 创建一个整数变量 maxLen,用于存储最长子串的长度,初始化为 0。 maxLen 用于记录当前遍历过程中发现的最长无重复子串的长度。
- 创建一个整数变量 left,用于存储子串的左边界,初始化为 0。 left 用于记录当前无重复子串的起始位置。
- 使用一个 for 循环遍历字符串 s 中的每个字符,循环变量为 right。 right 指向当前正在处理的字符。
- 在循环中,通过 s.charAt(right) 获取当前字符,并将其赋值给变量 c。 获取当前正在处理的字符。
- 使用 if 语句判断 map 中是否包含字符 c,即判断当前字符是否已经出现过。 如果字符 c 已经在 map 中出现过,说明当前子串中存在重复字符。
- 如果字符 c 已经在 map 中出现过,执行 if 语句块中的代码。
- 在 if 语句块中,使用 Math.max 方法比较 left 和 map.get(c) + 1 的值,将较大的值赋给 left。 这是为了确保 left 不会回退到已经出现过的字符的位置之前。 如果当前字符 c 之前出现过,我们将 left 更新为该字符之前出现位置的下一个位置,以确保当前子串不会包含重复字符。
- 将字符 c 和当前索引位置 right 存入 map 中。 更新字符 c 在字符串中的最新出现位置。
- 使用 Math.max 方法比较 maxLen 和 right - left + 1 的值,将较大的值赋给 maxLen。 这是为了更新最长子串的长度。 计算当前子串的长度,并与当前最长子串长度进行比较,更新最长子串长度。
- 循环结束后,返回 maxLen 作为结果。 返回最长无重复子串的长度。
总结
该算法的核心思想是使用滑动窗口,通过遍历字符串,并使用 HashMap 记录字符出现的最新位置,来判断当前子串是否包含重复字符,并更新最长无重复子串的长度。
希望本文的代码逐行分析能帮助您更好地理解 Java 最长无重复子串算法的实现原理。
原文地址: https://www.cveoy.top/t/topic/qmgh 著作权归作者所有。请勿转载和采集!