力扣练习之无重复字符的最长子串

我爱海鲸 2023-01-14 18:06:01 力扣

简介中级算法、无重复字符的最长子串

原题出处: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;
    }
}

思路:我们用一个队列进行保存字符的值,每次都会判断字符在队列中是否存在,如果存在将队列里的值移出。不存在则将当前的值放入到队列中。这样就保证了队列中没有重复的字符且字符之间都是连续的,然后在保存队列的最大值(和当前的最大值做对比),然后返回即可。

 

你好:我的2025