原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xv2kgi/
解法一:
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) {
return 0;
}
Map<Character,Integer> map = new HashMap<>();
int max = 0;
for (int i=0,j=0; i<s.length(); i++ ) {
Character c = s.charAt(i);
if (map.containsKey(c)) {
j = Math.max(j,map.get(c)+1);
}
map.put(c,i);
max = Math.max(max,i-j+1);
}
return max;
}
}
思路:我们定义两个位置i和j,i记录子串的末尾下标,j记录子串的开始下标,遍历字符串中的字符,每次将字符作为key,下标作为value存到map中,在存入之前需要判断字符在map中是否存在,如果存在,那么需要移动j的值,当时要注意一点就是map中value值和当前的j取最大的一个值,作为最新的j,为什么要这样做是因为map中获取的下标有可能是比当前的j还要小。最后i-j+1得到当前子串的长度,和当前记录最大子串长度取一个最大值即可。
解法二:
class Solution {
public int lengthOfLongestSubstring(String s) {
Queue<Character> queue = new LinkedList();
int max = 0;
for (char c : s.toCharArray()) {
while (queue.contains(c)) {
queue.poll();
}
queue.add(c);
max = Math.max(max,queue.size());
}
return max;
}
}
思路:我们用一个队列进行保存字符的值,每次都会判断字符在队列中是否存在,如果存在将队列里的值移出。不存在则将当前的值放入到队列中。这样就保证了队列中没有重复的字符且字符之间都是连续的,然后在保存队列的最大值(和当前的最大值做对比),然后返回即可。