LeetCode 3. 无重复字符的最长子串
3. 无重复字符的最长子串
Solution
思路:刚开始考虑是map记录下标,然后重复的话就看map的下标位置,得到极大子串的长度,但是没有考虑到这个过程中是可以维护出不重复的字串的,通过几个样例模拟,然后就以为map只是一开始用到了,后面都是靠的下标去得到子串长度,不删除的话还不好维护,没往删除上面考虑,然后感觉意义不大。看了题解,MD
很接近了。从左开始枚举起点,整个过程中子串右端点不断递增,通过不断左移以及右移即可维护。
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
Set<Character> set = new HashSet<>();
int l = 0, r = 0;
int maxLen = 0;
while (r < len) {
if (!set.contains(s.charAt(r))) {
set.add(s.charAt(r));
maxLen = Math.max(maxLen, set.size());
r++;
} else {
set.remove(s.charAt(l));
l++;
}
}
return maxLen;
}
}
同样,可以使用Map
记录下标来直接跳转!自己实现的时候使用了值毫无意义的Map
,这个时候就应该Set
,记录下标后就有意义了。
脑子就是不行了。。。
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
int start = 0, maxLen = 0;
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < len; i++) {
if (map.containsKey(s.charAt(i))) {
start = Math.max(start, map.get(s.charAt(i)) +1);
}
maxLen = Math.max(maxLen, i - start + 1);
map.put(s.charAt(i), i);
}
return maxLen;
}
}
埋骨何须桑梓地,人生无处不青山