给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
代码:
public int lengthOfLongestSubstring(String str) {
if (str == null || str.length() == 0) return 0;
HashMap<Character, Integer> temp = new HashMap<>();
char[] chars = str.toCharArray();
int res = 0, start = 0;
for (int i = 0; i < chars.length; i++) {
if (temp.containsKey(chars[i])) {
start = Math.max(temp.put(chars[i], i) + 1, start);
}
temp.put(chars[i], i);
res = Math.max(res, i - start + 1);
}
return res;
}
解题思路:用 map 记录字符和对应的位置坐标,循环字符对应的字符数组,当遇到重复字符时替换之前的字符的位置坐标,也就是替换 map 里当前重复的 key 对应的 value 值,并移动 start 指针,start 表示当前这个不重复的字符里第一个字符的位置。
start 开始默认是 0,然后遇到重复字符修改 start 的值或者没遇到重复的字符后,往 map 里添加循环对应的当前字符,并计算得到新的 start ,是通过取当前重复字符的上一个字符的位置加一和已经存在的 start 的最大值来获得新的 start 。
每次循环都计算一个最大长度值并用 res 表示,用 i - start + 1 来获得是因为当前位置减去当前最开始没有重复字符的位置是当前位置之前的最大字符长度,用此长度和之前的 res 取最大值,最后获得的 res 就是最后的结果。
网友评论