原题链接:
https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
题意理解
这个题目可以用滑动窗口来解决。用 [l,r] [ l , r ] 描述最终给出长度的区间。如果 a[r+1] a [ r + 1 ] 在 [l,r] [ l , r ] 中出现过,那么就清除 [l,a[r+1]上次出现的位置] [ l , a [ r + 1 ] 上 次 出 现 的 位 置 ] ,然后 r→r+1 r → r + 1 ,如果 a[r+1] a [ r + 1 ] 在 [l,r] [ l , r ] 中没有出现过,那么 r→r+1 r → r + 1
我的代码
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0) {
return 0;
}
Map<Character, Integer> pos = new HashMap<>();
int maxLen = 0;
int len = 0;
int start = 0;
char[] subs = s.toCharArray();
for(int i = 0; i < subs.length; i++) {
if(!pos.containsKey(subs[i])) {
len++;
pos.put(subs[i], i);
maxLen = Math.max(maxLen, len);
} else {
int index = pos.get(subs[i]);
for(int j = start; j <= index; j++) {
pos.remove(subs[j]);
}
start = index + 1;
pos.put(subs[i], i);
len = i - index;
}
}
return maxLen;
}
}
解后反思
找了一份比较快的代码
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] str = s.toCharArray();
int l = 0, r = 0, max = 0;
int[] memo = new int[256];
Arrays.fill(memo, -1);
while (r < str.length) {
int index = memo[str[r]];
if (index >= l){
l = index + 1;
} else {
// max = max < r - l + 1 ? r - l + 1 : max;
max = Math.max(r-l+1,max);
}
memo[str[r]] = r;
r++;
}
return max;
}
}
这份代码的主要特点是用数组来手写一个简单的map,因此会快一些