解题思路
使用滑动窗口法,用以维护一个没有重复字母的队列。使用一个散列表记录每个字母的位置,如果在向后遍历的时候遇到了之前出现过的字母,则跳转到散列表中记录的位置的后一位。每次遇到了之前出现过的字母时都更新一遍最长长度,否则,则把字母位置记录到散列表中。代码如下:
class Solution {
HashMap<Character, Integer> exists = new HashMap<>();
public int lengthOfLongestSubstring(String s) {
if(s.length() == 1) return 1;
int length = 0;
int flag = 0;
for (int i = flag; i < s.length(); i++) {
char now = s.charAt(i);
if (alreadyhave(now) != -1 && alreadyhave(now) != i) {
int length_tmp = i - flag;
if (length_tmp > length)
length = length_tmp;
flag = alreadyhave(now) + 1;
exists.clear();
i = flag - 1;
} else {
exists.put(now, i);
}
}
if(!exists.isEmpty()){
int length_tmp = s.length() - flag;
if(length_tmp > length)
length = length_tmp;
}
return length;
}
public int alreadyhave(char c) {
return exists.get(c) == null ? -1 : exists.get(c);
}
}