问题描述
- 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解
思路
- 定义hash表用于存储已经遍历过的字节和字节对应的最大下标
- 每次遍历 判断当前字节是否已经存在,存在则获取将最大长度和当前长度中的最大值置为最大长度,修改当前长度为当前长度到当前字节上一次出现的位置的长度;否则当前长度+1
- 遍历结束返回最大长度和当前长度中的最大值
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
// 将字符串转为字节数组
char[] chars = s.toCharArray();
// 定义最大长度和当前无重复的长度
int currentLength = 1, maxLength = 1;
// hash表用于存储已经遍历过的字节和字节对应的最大下标
HashMap<Character, Integer> map = new HashMap<>();
map.put(chars[0], 0);
for (int i = 1; i < chars.length; i++) {
// 判断当前字节是否已经存在
if (map.containsKey(chars[i])) {
// 存在则获取将最大长度和当前长度中的最大值置为最大长度
maxLength = Math.max(currentLength, maxLength);
Integer index = map.get(chars[i]);
// 修改当前长度为当前长度到当前字节上一次出现的位置的长度
currentLength = i - index;
} else {
// 不存在,当前长度+1
currentLength++;
}
map.put(chars[i], i);
}
// 返回最大长度和当前长度中的最大值
return Math.max(maxLength, currentLength);
}
LeetCode题目地址