力扣系列之-3. 无重复字符的最长子串

30 阅读1分钟

做题历程

如果我们不管重复值,用双指针来获取字符串的长度,这一步很简单

public int lengthOfLongestSubstring(String s) {
    char[] charArray = s.toCharArray();

    int left = -1;
    int ans = 0;

    for (int right = 0; right < charArray.length; right++) {
        ans = Math.max(ans, right - left);
    }
    return ans;
}

加点东西,加个哈希表来维护一下每个值和对应的索引吧!

public int lengthOfLongestSubstring(String s) {
    Map<Character, Integer> map = new HashMap<>();
    char[] charArray = s.toCharArray();

    int left = -1;
    int ans = 0;

    for (int right = 0; right < charArray.length; right++) {
        Character value = charArray[right];
        map.put(value, right);
        ans = Math.max(ans, right - left);
    }
    return ans;
}

如何判断重复值?

用哈希表判断一下?

if (map.containsKey(value)) {
    left = map.get(value);
}
public int lengthOfLongestSubstring(String s) {
    Map<Character, Integer> map = new HashMap<>();
    char[] charArray = s.toCharArray();

    int left = -1;
    int ans = 0;

    for (int right = 0; right < charArray.length; right++) {
        Character value = charArray[right];
        if (map.containsKey(value)) {
            left = map.get(value);
        }
        map.put(value, right);
        ans = Math.max(ans, right - left);
    }
    return ans;
}

遇到重复值就把左指针的位置更新到上一次出现的位置。这样逻辑上就把字符串左指针左边的字符删除了。但是假如我们再一次碰到重复值,但是取到的位置却是左指针左边的位置怎么办?看起来代码还需要修改一下!

if (map.containsKey(value)) {
    int valueIndex = map.get(value);
    if (valueIndex > left) {
        left = valueIndex;
    }
}

取到的重复值的位置大于当前左指针才更新左指针

大功告成

public int lengthOfLongestSubstring(String s) {
    Map<Character, Integer> map = new HashMap<>();
    char[] charArray = s.toCharArray();

    int left = -1;
    int ans = 0;

    for (int right = 0; right < charArray.length; right++) {
        Character value = charArray[right];
        if (map.containsKey(value)) {
            int valueIndex = map.get(value);
            if (valueIndex > left) {
                left = valueIndex;
            }
        }
        map.put(value, right);
        ans = Math.max(ans, right - left);
    }
    return ans;
}

图片.png